静态成员就是在成员变量和成员函数前加上关键词static。
静态成员分为:
- 静态成员变量
1.所有对象共享一份数据
2.在编译阶段分配内存
3.类内声明,类外初始化
4.它不属于任何对象,是类定义的一部分,它在程序开始运行时创建
5.它所占空间的回收在程序结束时进行。 - 静态成员函数
1.所有对象共享一个函数
2.静态成员函数只能访问静态成员变量
//静态成员变量
class Person
{
public:
//1.所有对象都共享同一份数据
//2.编译阶段就分配内存
//3.类内声明,类外初始化操作
static int m_A;
private:
static int m_B;
};
int Person::m_A=100;
int Person::m_B=200;//这个在私有权限内,无法访问
void test01()
{
Person p;
cout<<p.m_A<<endl;
}
void test02()
{
//静态成员变量 不属于某个对象上,所有对象都共享同一份数据
//因此静态成员变量有两种访问方式
//1.通过对象进行访问
Person p;
cout<<p.m_A<<endl;
cout<<p.m_B<<endl;//类外访问不到私有静态成员变量
//2.通过类名进行访问
cout<<Person::m_A<<endl;
}
int main()
{
test01();
}
//静态成员函数
//所有对象共享同一个函数
//静态成员函数只能访问静态成员变量
class Person
{
public:
//静态成员函数
static void func()
{
m_A=100;//静态成员函数可以访问静态成员变量
m_B=200;//静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的m_B属性
cout<<"static void func调用"<<endl;
}
static int m_A;
int m_B;
};
//静态成员函数也是有访问权限的,不能访问私有区域。
int Person::m_A=0;
void test01()
{
//通过对象访问
Person p;
p.func();
//通过类名访问
Person::func();
}
int main()
{
test01();
}
由于静态成员函数没有this指针,它只能直接访问该类的静态数据成员,静态成员函数和类以外的函数和数据。
访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。