C++中static关键字总结

static存在的意义:

       函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。


static的声明与定义:
      静态数据成员要实际地分配空间,故
不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
      static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。


static使用时注意事项:

1. 当在类的外部定义static成员函数时,不需要重复指定static保留字,只出现在类定义体内部的声明处;

2. static成员是类的组成部分,但不是任何对象的组成部分;因此,static成员函数没有this指针。同时不能被声明为const,因为将成员函数声明为const就是承诺不会修改该函数所属的对象。;也不能被声明为virtual函数。

3. static数据成员必须在类定义体的外部定义。而不是通过构造函数初始化,一般在类成员实现文件中初始化;

4. 类的static成员,以及普通数据成员,不能在类的定义体中初始化!除了常量const!

5. const static 与 static const没有差别!

6. static数据成员的类型可以是该成员所属的类类型,同样是因为static数据成员不属于任何一个对象,在分配大小时,不需要考虑自身,考虑自身会出现死循环而导致出错。非static成员被限定声明为其自身类对象的指针或引用;

如:

class A
{
    private:
            static A a1;   //  OK  
             A * a2;      // OK
             A a3;  // Wrong
}

7. static局部变量在程序执行第一次通过定义初始化,在程序结束前都不会被撤销。

8. 由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X Window系统结合,同时也成功的应用于线程函数身上。 http://my.oschina.net/u/438140/blog/57571 中有些例子可以帮助理解回调函数。


C++中static关键字总结,布布扣,bubuko.com

C++中static关键字总结

上一篇:spring中加入log4j


下一篇:WinCE的C++程序直接部署到目标文件夹地址的设置办法,%CSIDL_PROGRAM_FILES%