静态变量

静态变量

在C语言及由其衍生出的C++与Objective-C等程序语言中,“static”是用于控制变量的生命周期和连接方式(即其作用域,亦即可见性)的保留字。确切来说,正如C族语言中的extern,auto与register这些保留字一样,static也是一种存储类(此处的“类”与面向对象语言的“类”的定义不同)标识。每个变量与函数都有以上的一种存储类标识,如果在声明中没有明确标识其存储类,编译时就会根据上下文来选择其默认存储类,如在源文件里的所有文件级变量对应的默认存储类是extern,而在函数体内的变量对应的则是auto,各存储类的属性如下表所列。

存储类名

生命周期

作用域

extern

静态(程序结束后释放)

外部(整个程序)

static

静态(程序结束后释放)

内部(仅翻译单元,一般指单个源文件)

auto,register

函数调用(调用结束后释放)

易见存储类为extern的变量(包括上面提到的未明确声明存储类的文件级变量)符合前段所述静态变量的定义1,但不符合定义2。

不同情况下的作用

编辑

除明确标识出变量的生命周期(英语:Object lifetime)外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用:

对于静态全局变量来说,针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域;

对于静态局部变量来说,在函数内以static声明的变量虽然与自动局部变量的作用域相同(即作用域都只限于函数内),但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同(一般来说,静态分配时存储空间于编译时在程序数据段分配,一次分配全程有效;而自动分配时存储空间则是于调用栈上分配,只在调用时分配与释放),且两次调用间变量值始终保持一致;必须注意,静态局部变量只能初始化一次,这是由编译器来保证实现。[1]

对于静态成员变量来说,在C++中,在类的定义中以static声明的成员变量属于类变量(英语:Class variable),也即在所有类实例中共享,与之相对的就是过程变量(英语:Instance variable)。

C示例

编辑

在C语言中,带有静态变量的程序如下所示:

#include

void func() {

static int x = 0; // 在对func的三次调用中,x只进行一次初始化

printf("%d\n", x); // 输出x的值

x = x + 1;

}

int main(int argc, char * const argv[]) {

func(); // 输出0

func(); // 输出1

func(); // 输出2

return 0;

}

C++示例

编辑

在C++中,带有含私有静态内部变量的类的程序如下所示:

class Request

{

private:

static int count; // 不能为外部调用

string url; // 只能被成员函数调用

public:

Request() { count++; }

string getUrl() const { return url; }

void setUrl(string value) { url = value; }

static int getCount() { return count; }

};

int Request::count = 0; // count 可以在类声明外进行初始化

PHP示例

编辑

function test(){

static $a = 0;//变量$a在第一调用test()时被初始化,每次调用 test() 函数都会输出 $a 的值并加 1

echo $a;

$a++;//,每次调用 test() 函数都会输出 $a 的值并加 1

}

?>

相关文章

MSIC青少年性教育课程
365bet官网体育投注

MSIC青少年性教育课程

⌛ 07-26 👁️ 3301