Static关键字
- 静态存储,在固定的地址上分配,
也就是说对象是在一个特殊的静态数据区上创建的,
而不是每次在函数调用时的堆栈上产生的。
-
函数体内部的静态对象
如果对象是一个类,程序控制第一次转到对象的定义时,而且只有第一次时,才需要执行构造函数。静态对象的析构函数
静态对象的析构函数在程序从main()块中退出时,或者标准的C库函数exit()被调用时才被调用。
如果一个包含静态对象的函数从未被调用过,
那么这个对象的构造函数也不会执行,析构函数也不会执行。C++中,全局静态对象的构造函数是在main()之前调用的,
所以我们现在有了一个在进入main()之前执行一段代码的简单的、可移植的方法,
并且可以在退出main()之后用析构函数执行代码。
要在C中做到这一点,我们不得不熟悉编译器开发商的汇编语言的开始代码。
-
- 对一个特定的编译单位来说是本地的。
这里static控制名字的可见性,
所以这个名字在这个单元或类之外是不可见的。-
一般情况下,在文件范围内的所有名字(既不嵌套在类或者函数中的名字)对程序中的所有编译单元来说都是可见的,这就时所谓的外部连接。
在文件范围内,一个被明确声明为static的对象或函数的名字对编译单元(一般是指出现声明的.cpp文件)来说时局部变量,这就是所谓的内部连接。
内部连接的好处就是这个名字放在一个头文件中,不用担心连接时发生冲突。
那些通常放在头文件里的名字,象常量、内联函数,缺省情况下(C++是内部连接,C是外部连接)
-
- 冲突问题:
static两个含义怎样交叉。-
所有的全局对象都是隐含为静态存储类。
int a=0;
main(){/*...*/}
则a被存储在程序的静态数据区,在进入main()函数前,a即被初始化。
另外,a对全局都是可见的,包括所有的编译单元。用可见性术语,static(只在编译单元内可见)的反义是extern,他表示这个名字对所有的编译单元是可见的。
int a = 0;
extern int a =0;
上面这两个效果是一样的。
static int a= 0;
这么定义仅仅改变了a的可见性,现在a成了一个内部连接。但存储类型没有改变。
-