1.静态变量有什么作用
static全局变量和普通的全局变量的区别在于static全局变量只初始化一次,下一次的运算依据是上一次的结果值。static()函数与普通函数的区别在于作用于不一样,static()函数只在一个源文件中有效,不能被其他源文件使用。
在C++中,在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。静态数据成员有以下特点:
1)对于非静态数据成员,每个类对象都有自己的复制品。而静态数据成员被当作是类的尘缘。无论这个类的对象被定义了多少次,静态数据成员在程序中也只有一份复制品,由该类型的所有对象共享访问;
2)静态数据成员存储在全局数据区。不属于特定的类对象,在没产生类的实例时,程序员也可以使用它;
3)静态数据成员和普通数据成员一样遵从public、protected、private访问规则;
4)static成员变量的初始化是在类外,此时不能再带上static的关键字private。protected的static成员虽然可以在类外初始化,但是不能在类外被访问。
静态数据成员不具有this指针,不能访问属于类对象的非静态数据成员,也无法访问非静态数据成员,它只能调用其余的静态成员函数。
附:为什么static变量只初始化一次?
对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。
存放在静态区域的变量的生命周期一般比较长,一般与整个源程序“同生死,共存亡“,所以只需要初始化一次,而自动变量由于存放在栈区,一旦过程结束,就即刻被销毁。
例如:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void
fun(
int
i) { static int val = i++; cout << "val = " << val << endl; } int main() { fun( 0 ); fun( 1 ); fun( 2 ); return 0 ; } 程序输出为: 0 0 0 void fun1( int i) { static int val = i++; val = i++; cout << "val = " << val << endl; } int main() { fun1( 0 ); fun1( 1 ); fun1( 2 ); return 0 ; } 程序输出为: 1 1 2 |
因为当调用fun1(0时,由于val被声明为static,所以定义语句只执行一次,此时val = i++,val的值为0,i的值变为1,执行第二语句val=i++后,此时val的值为i的初值为1,接着i的值变为2,所以第一次调用时输出为1.当调用fun(1)时,因为val是静态变量,具有记忆功能,所以会跳过定义语句,执行val=i++语句,所以val的值为1,而此时i的值变为2,所以第二次调用时输出为1.后面同样如此。
另外:在头文件中不建议定义静态变量,不然会引起空间浪费或者程序错误。所以不建议在头文件中定义任何变量,当然也包括静态变量。