static两种不同的职责,一是其持久存储的,二是访问性受到局限,一个是在哪里,另一个是谁能看到你,在C中基本是这样的。
static in C++
static 本地变量是持久存储的,但是,只有在本地域的范围内才能访问,下面只能在f()中访问static本地变量x
int f(){
static int x;
x++;
return x;
}
int main(){
cout << f() << endl;
cout << f() << endl;
return 0;
}
静态成员变量被所有的对象实例共享
class A{
public:
A(int i):i(i){
cout << "A()" << endl;
}
~A(){
cout << "~A()" << endl;
}
static int j;
private:
int i;
};
int A::j = 0;
int main(){
A a(1),b(2);
cout << a.j << endl;
a.j += 100;
cout << b.j << endl;
return 0;
}
静态成员函数被所有对象共享,只可访问静态成员,否则:
[Error] invalid use of member ‘A::i’ in static member function
函数中的静态对象
函数中若有静态对象,那么它什么时候被初始化,每次调用函数的时候怎么处理?
class X{
public:
X(int x, int y):x(x),y(y){
cout << "X()" << endl;
}
~X(){
cout << "~X()" << endl;
}
void inc(){
this->x++;
this->y++;
}
void out(){
cout << "x:" << x << endl;
cout << "y:" << y << endl;
}
private:
int x,y;
};
void g(){
static X x(0,0);
x.inc();
x.out();
}
int main(){
cout << "start" << endl;
g();
g();
return 0;
}
结果:
start
X()
x:1
y:1
x:2
y:2
~X()
多次调用g(),只初始化一次对象,再次调用时,使用同一对象,g()第一次调用时,x初始化。
全局(global)对象
全局对象的构造函数在main函数之前被调用,当main退出或exit被调用时析构