C/C++ static用法

C/C++ static用法

Dec 26, 2013
Coding
C++, Static

预备知识 #

变量分类

  • 按作用域分: 局部变量;全局变量
  • 按生存周期分:动态变量;静态变量
名称 定义 按定义位置的称谓
局部变量 函数内定义的变量 内部变量
全局变量 函数之外定义的变量 外部变量
名称 定义 说明
动态变量 声明为auto的变量[auto默认省略不写] 出了作用域其内存就被释放
静态变量 声明为static的变量 保存在全局数据区,程序运行期间不释放

C\C++中static的用法 #

主要为以下4种,其中1-3为C\C++共有,4为C++特有(因为涉及到类)

1. 声明静态局部变量 #

即将一个局部变量的生存周期设定为整个应用程序的生存周期。

但是,这并不影响着它的作用域仍为局部区域。

code

上图中代码,在TestStaticLocalVariable()函数中,a为局部变量,又被声明成了static类型,即静态局部变量。所以,第一次调用TestStaticLocalVariable()函数时,给a赋初始值1,然后输出2;第二次调用TestStaticLocalVariable()函数时,会跳过a的定义语句,直接将a++,由于a保存了2,所有++后输出3。即a一直存在,但只能由TestStaticLocalVariable()函数调用。

2. 声明静态全局变量 #

即声明为static类型的全局变量。

作用:为了使本文件内定义的全局变量,不能被其他文件使用。

注:全局变量肯定是静态存储(生存周期)的,无论加static与否。但是加上static后,它的作用域就变了,只在本文件中可见。案例如下

(1) 新建一个C++ Project,添加一个cpp文件,名为File,其中添加如下代码:

code

(2) 在main.cpp文件中,声明外部变量,并试图使用。

code

可见,编译器将stc报错,而var可以通过。因为,stc被我们声明成了static类型。

3. 声明内部函数 #

  • 内部函数:不能被其他文件调用的函数
  • 外部函数:能够被其他文件调用的函数

在函数名前加static后,函数变成内部函数,不能被其他文件调用。【类似于外部变量,为了使本文件定义的函数,不能被其他文件使用】案例如下:

(1) 新建一个C++Project,添加一个cpp文件,名为File,其中添加如下代码:

code

(2) 在main.cpp文件中,声明 add 和 sub 两个外部函数,并试图使用。

code

可见,编译器将add报错,而sub可以通过。因为,add函数被我们声明成了static类型,mian.cpp中是不能使用的。

4. 声明类的静态成员变量和成员函数(C++) #

在类的成员变量或成员函数前声明static,使得类的成员属于整个类,被该类所有的对象共享。

类的静态成员(变量\函数),可以通过类名来调用(类名::成员名)。非静态成员不可以通过类名调用。静态和非静态成员都可以通过对象名调用。

由整体(属于整个类的成员,即静态的)不可访问特殊(属于具体对象的成员,非静态),特殊可以访问整体可知

  • 静态成员函数不可以访问非静态成员变量和非静态成员函数【整体不可访问特殊】
  • 非静态成员函数中可以使用静态成员变量和静态成员函数 【特殊可以访问整体】

该文2011-07-15 18:28首发于我的CSDN专栏。有改动。