C++中static用法详解
作用
1:修饰普通变量:
2:修饰普通函数:
3:修饰成员变量:
4:修饰成员函数:
一:c与c++共有的
1:静态局部变量:用于函数内部修饰变量,这种变量的生存周期一直到程序关闭。
int foo() { static int si = 1; //note:1 int ci = 1; //note:2 si += 1; printf("&si = %p\t si = %d\t &ci = %p\t ci = %d\n", &si, si, &ci, ci); return si; }
其中si的初始化,是在函数比调用的时候,才进行的初始化。
静态局部变量与全局变量的区别:
全局变量作用域不同,他不像静态局部变量作用域只在函数体内(需要验证)。但是生命周期一样的?
2:静态局部变量与普通局部变量的区别:
区别
|
静态局部变量
|
普通局部变量
|
全局变量
|
1
|
在全局数据区分配内存 |
在栈区分配内存
|
|
2
|
在程序首次执行到它的时候,进行首次初始化
|
每次函数执行到它的时候都会被初始化
|
|
3
|
静态局部变量,一般在声明处初始化;没有显示的初始化,会被程序自动初始化为0
|
局部变量如果不显示的初始化,那么就不会呗初始化。它的值可能是个随意值。
|
|
4
|
他驻留在全局数据区,生命周期知道整个程序运行结束(而不是函数运行结束);但是作用域只能在函数内,不能在函数外使用。
|
局部变量在栈区,函数结束后立即释放
|
作用域所有函数可用;
|
3:静态全局变量
定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。
作用域:该文件内部。
生存周期:整个程序运行期间。
static int gsi = 1;//note:3 int gi = 1; //note:4 int gfoo() { gsi += 1; gi += 1; printf("gfoo &gsi= %p\t gsi = %d\t &gi= %p\t gi = %d\n", &gsi, gsi, &gi, gi); return gsi; }
在本文件中,无论调用几次,gi和gsi结果都是一样的。 但是static限定了变量的作用域,只能在本文件内。
4:静态函数
静态函数跟静态全局变量的作用类似,即静态函数不能被其他文件所用。
其他文件可以定义相同名字的函数,不会发生冲突
作用域:该文件内部
生命周期:整个程序运行期间。
二,C++独有的:
1:静态数据成员:
生存周期:大于class的对象;
静态数据成员是所有类的对象共有一份;普通数据成员是每一个类的对象有一份 且相互无关联。
2:静态成员函数:
静态函数属于类,不属于某个具体的对象。 访问方式可以通过类对象调用,也可以用类名::函数名进行访问。