C++ 静态数据成员

一. 定义和性质

1. 定义

  • 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。
  • 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中(而是在相应的cpp文件中)。
//xxx.h文件

class base{   
private:   
    static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
};  


//xxx.cpp文件

const int base::_i=10; // 定义(初始化)时不受private和protected访问限制  

2. 性质

  • 和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。
  • C++静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。
  • C++静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
class base{   
public :   
    static int _staticVar;   
    int _var;   
    void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员   
    void foo2(int i=_var);//错误,_var为普通数据成员   
};  
  • C++静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。
class base{   
public :   
    static base _object1;//正确,静态数据成员
    base _object2;//错误   
    base *pObject;//正确,指针
    base &mObject;//正确,引用
};  

二. 为什么需要静态数据成员

不像全局变量,静态数据成员/成员函数保存了类的封装性。静态数据成员/成员函数相关于类,与对象的存毁无关。

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

参考文章:

C++静态数据成员定义及应用浅谈

C++静态数据成员存在的意义

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81915954