C++中的static

2014-09-01 by philokey

静态全局变量

在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量,存放在全局数据区。

全局变量和全局静态变量的区别

  • 全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
  • 全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。

静态局部变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

有时候需要在两次调用之间对变量的值进行保存。但是全局变量不易维护,所以可以使用静态局部变量。

静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

静态函数

在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

定义静态函数的好处:

  • 静态函数不能被其它文件所用;
  • 其它文件中可以定义相同名字的函数,不会发生冲突;

class中的静态成员

定义

对于类中的非静态成员,每个对象都有自己的该成员。而静态成员只创建一个副本。静态成员可以是函数。

class A {
private:
    char *str;
    static int num;
    static void output() ;  
};

每个对象都有自己的str,共享一个num

特点

//通过类名可以调用静态成员函数
A::output()

//静态成员函数中不能引用非静态成员
/*
因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。
*/
//output定义为
static void output() {
    cout<<str<<endl; //error!  
}

初始化

只有const static 的成员可以再类的声明中直接初始化。

静态成员一般选择在类的实现文件中,用构造函数以进行初始化

int A::num = 0;
//或者   
int A::num(0);

Comments