标签:
1.隐藏
当我们编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问。如,我们有源文件source1.cpp定义了一个全局变量i和函数Func
1 //source1.cpp
2 int i = 0;
3
4 void Func()
5 {
6 printf("Hello World\n");
7 }
如果在另一个文件main.cpp中是可以引用i和Func的。然而,如果一个文件要使用在其他源文件定义的变量或函数,一定要在此文件件中包含相应变量或函数的声明。其中变量一定要用extern声明,函数的声明加不加extern没有影响。如下所示:
1 //source1.cpp
2 extern int i; //变量i的声明
3 void Func(); //函数的声明
4
5 int main()
6 {
7 printf("%d\n", i); //使用变量i
8 Func(); //使用函数Func()
9
10 return 0;
11 }
如果加上static前缀,就不能像上面的程序一样被其他程序使用。
1 static int i = 0;
2
3 static void Func()
4 {
5 printf("Hello World\n");
6 }
2. static的第二个作用是默认初始化为0,包括未初始化的全局变量与局部静态变量。其实,未初始化的全局变量也具备这一属性,因为未初始化的全局变量与未初始化的静态变量时存储在同一块区域内(BSS段)
3. static的第三个作用是保持局部变量内容的持久。
函数内自动变量,当调用时就存在,退出函数时就消失,但静态局部变量虽然在函数内定义,但静态局部变量始终存在着,也就是说它的声明期为整个源程序,其特点是只进行一次初始化且拒具有’记忆性‘。
静态局部变量的生存期虽然为为整个源程序,但其作用域仍然与局部变量相同,即只能在定义该变量的函数内使用该变量。退出函数后,尽管该变量还继续存在,但不能继续使用它。
1 class A { 2 public: 3 static void Func() { 4 cout<<"Hello World"<<endl; 5 } 6 7 static int i; 8 }; 9 10 int A::i = 9; 11 12 int main() 13 { 14 A a; 15 A* pa = &a; 16 A &ra = a; 17 18 A::Func(); //使用类型调用静态成员函数 19 a.Func(); //使用对象调用静态成员函数 20 pa->Func(); //使用对象指针调用静态成员函数 21 ra.Func(); //使用对象引用调用静态成员函数 22 23 cout<<A::i<<endl; //使用类型调用静态数据成员 24 cout<<a.i<<endl; //使用对象调用静态数据成员 25 cout<<pa->i<<endl;//使用对象指针调用静态数据成员 26 cout<<ra.i<<endl; //使用对象引用调用静态成员数据 27 28 return 0; 29 }
标签:
原文地址:http://www.cnblogs.com/vincently/p/4378747.html