C/C++ static用法
Dec 26, 2013
预备知识 #
变量分类
- 按作用域分: 局部变量;全局变量
- 按生存周期分:动态变量;静态变量
名称 | 定义 | 按定义位置的称谓 |
---|---|---|
局部变量 | 函数内定义的变量 | 内部变量 |
全局变量 | 函数之外定义的变量 | 外部变量 |
名称 | 定义 | 说明 |
---|---|---|
动态变量 | 声明为auto的变量[auto默认省略不写] | 出了作用域其内存就被释放 |
静态变量 | 声明为static的变量 | 保存在全局数据区,程序运行期间不释放 |
C\C++中static的用法 #
主要为以下4种,其中1-3为C\C++共有,4为C++特有(因为涉及到类)
1. 声明静态局部变量 #
即将一个局部变量的生存周期设定为整个应用程序的生存周期。
但是,这并不影响着它的作用域仍为局部区域。
上图中代码,在TestStaticLocalVariable()函数中,a为局部变量,又被声明成了static类型,即静态局部变量。所以,第一次调用TestStaticLocalVariable()函数时,给a赋初始值1,然后输出2;第二次调用TestStaticLocalVariable()函数时,会跳过a的定义语句,直接将a++,由于a保存了2,所有++后输出3。即a一直存在,但只能由TestStaticLocalVariable()函数调用。
2. 声明静态全局变量 #
即声明为static类型的全局变量。
作用:为了使本文件内定义的全局变量,不能被其他文件使用。
注:全局变量肯定是静态存储(生存周期)的,无论加static与否。但是加上static后,它的作用域就变了,只在本文件中可见。案例如下
(1) 新建一个C++ Project,添加一个cpp文件,名为File,其中添加如下代码:
(2) 在main.cpp文件中,声明外部变量,并试图使用。
可见,编译器将stc报错,而var可以通过。因为,stc被我们声明成了static类型。
3. 声明内部函数 #
- 内部函数:不能被其他文件调用的函数
- 外部函数:能够被其他文件调用的函数
在函数名前加static后,函数变成内部函数,不能被其他文件调用。【类似于外部变量,为了使本文件定义的函数,不能被其他文件使用】案例如下:
(1) 新建一个C++Project,添加一个cpp文件,名为File,其中添加如下代码:
(2) 在main.cpp文件中,声明 add 和 sub 两个外部函数,并试图使用。
可见,编译器将add报错,而sub可以通过。因为,add函数被我们声明成了static类型,mian.cpp中是不能使用的。
4. 声明类的静态成员变量和成员函数(C++) #
在类的成员变量或成员函数前声明static,使得类的成员属于整个类,被该类所有的对象共享。
类的静态成员(变量\函数),可以通过类名来调用(类名::成员名)。非静态成员不可以通过类名调用。静态和非静态成员都可以通过对象名调用。
由整体(属于整个类的成员,即静态的)不可访问特殊(属于具体对象的成员,非静态),特殊可以访问整体可知
- 静态成员函数不可以访问非静态成员变量和非静态成员函数【整体不可访问特殊】
- 非静态成员函数中可以使用静态成员变量和静态成员函数 【特殊可以访问整体】
该文2011-07-15 18:28首发于我的CSDN专栏。有改动。