静态成员变量
类的成员变量使用static
关键字修饰时,成为静态成员变量,静态成员变量:
- 属于整个类所有,不依赖于任何对象,可通过类名访问(此时只能为
public
),所有对象共享类的静态成员变量,可通过对象名访问; - 位于全局数据区,生命周期为程序运行期,需要在类外单独分配空间,语法:
Type ClassName::VarName = value;
静态成员函数
类的静态成员函数同样使用static
关键字修饰,静态成员函数:
- 属于整个类所有,不依赖于任何对象,可通过类名访问,所有对象共享类的静态成员变量,可通过对象名访问;
- 只能访问静态成员变量,不能访问普通成员变量和普通成员函数,没有
this
指针。
实战:用静态成员统计类对象个数
#include "iostream"
using namespace std;
class Cplus
{
private:
static int m_member;//统计对象个数,限定为private因此外部不能直接访问
public:
Cplus()
{
++m_member;
}
~Cplus()
{
--m_member;
}
static int get_m_member()//m_member为私有,通过类的静态成员函数访问保证安全性与隐藏性
{
return m_member;
}
};
int Cplus::m_member = 0;//静态成员变量不隶属于任何对象,类外单独分配空间
int main()
{
Cplus c1;
cout<<"Cplus类对象个数:"<<Cplus::get_m_member()<<endl;
Cplus c2;
cout<<"Cplus类对象个数:"<<Cplus::get_m_member()<<endl;
auto p = new Cplus();
cout<<"Cplus类对象个数:"<<Cplus::get_m_member()<<endl;
return 0;
}
运行结果
Cplus类对象个数:1
Cplus类对象个数:2
Cplus类对象个数:3
总结
静态成员变量和静态成员函数都是类所有,对象共享,既可以通过类名访问,也可以通过对象访问。通过类名访问的前提是该变量是公有的,静态成员变量需要在类外单独分配空间,静态成员函数只能访问静态成员变量。
参考
狄泰软件学院 - C++深度解析教程 - 第24课、26课