static的作用
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。
0x01 (普通)全局变量与静态全局变量 (隐藏)
未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
static全局变量只初始化一次,防止在其他文件中被引用。
0x02 (普通)局部变量与静态局部变量
局部变量改为静态变量后是改变了它的存储方式(唯一的一次初始化),即改变了它的生存周期。
作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
1 // StaticDemo.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 7 int Function(); 8 int main(void) 9 { 10 for (int i = 0; i <= 10; ++i) 11 printf("%d\n",Function()); 12 return 0; 13 } 14 15 int Function() { 16 static int StaticNumberUnitOnlyOnce = 666; // 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。 17 return StaticNumberUnitOnlyOnce--; //在static出现前,要达到同样的功能,则只能使用全局变量: <br>}
0x03 (普通)函数和静态函数
未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
0x04 C++中的类成员声明static
静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。
0x01 (普通)全局变量与静态全局变量 (隐藏)
未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
static全局变量只初始化一次,防止在其他文件中被引用。
0x02 (普通)局部变量与静态局部变量
局部变量改为静态变量后是改变了它的存储方式(唯一的一次初始化),即改变了它的生存周期。
作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// StaticDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
int
Function();
int
main(
void
)
{
for
(
int
i = 0; i <= 10; ++i)
printf
(
"%d\n"
,Function());
return
0;
}
int
Function() {
static
int
StaticNumberUnitOnlyOnce = 666;
// 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
return
StaticNumberUnitOnlyOnce--;
//在static出现前,要达到同样的功能,则只能使用全局变量: <br>}
|
0x03 (普通)函数和静态函数
未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
0x04 C++中的类成员声明static
静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。