1. 全局静态变量
2. 局部静态变量
3. 静态函数(可不是静态成员函数哦)
1. 静态数据成员
2. 静态成员函数
1. 全局静态变量
他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
看下面关于作用域的程序:
//testStatic1.cpp
#include <iostream>
using namespace std;
extern int n;
{
n = 20;
cout << n << endl;
display();
return 0;
}
#include <iostream>
using namespace std;
void display()
{
n++;
cout << n << endl;
}
他被显示初始化)
为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其
例如:
#include <iostream>
using namespace std;
void staticDis();
{
display();
staticDis();
renturn 0;
}
#include <iostream>
using namespace std;
{
staticDis();
cout << "display() has been called " << endl;
}
{
cout << "staticDis() has been called" << endl;
}
存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。(摘自《C++ Primer》 P337)
由于static变量的以上特性,可实现一些特定功能。
以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如下:
#include <iostream>
using namespace std;
{
int i;
for (i = 1; i <= 3; i++)
count();
return 0;
}
{
static num = 0;
num++;
cout << " I have been called" << num << "times" << endl;
}
I have been called 1 times.
I have been called 2 times.
I have been called 3 times.
件中。
无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类类型的所有对象共享访问。
可能性。
Account( double amount, const string &owner );
String owner() { return _owner ;}
private:
static double _interestRate;
double _amount;
string _owner;
};
这是因为每个Account对应不同的主人,有不同数目的钱,而所有Account的利率却是相同的。
_interestRate声明为静态数据成员减少了每个Account所需的存储空间。
更新一次我们就可以保证每个Account对象都能访问到更新后的值。要是每个类对象都维持自己的一个拷贝,那么每个拷贝都必须更新,这将导致效率低下和更大的错误可能。
7)静态数据成员的“唯一性”本质(独立于类的任何对象而存在的唯一实例),使他能够以独特
的方式被使用,这些方式对于非static数据成员来说是非法的。
或引用,例如:
public:
//...
private:
static Bar mem1; //OK
Bar *mem2; //OK
Bar mem3; //错误
};
private:
int var;
static int stcvar;
public:
//错误:被解析为非static的Foo:var
//没有相关的类对象
int mem1( int = var );
//无需相关的类对象
int mem2( int = stcvar );
int mem3( int = ::var );
};
态成员函数不能声明为const或volatile,这与非静态成员函数不同。
译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。
函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类对象。
他文件所用。
原文链接: https://www.cnblogs.com/lzjsky/archive/2010/11/22/1884509.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/17719
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!