静态成员由关键字static修饰,且可以设置访问权限。静态成员在对象被创建之前就已经存在,属于类,而不属于对象。
一、静态成员属性
由一个类创建的所有对象共享同一份静态成员属性。
静态成员属性属于类但不属于由类创建的对象,所以既可以通过对象访问,也可以通过类方式访问。
静态成员属性必须在类内声明,在类外初始化。
class Person
{
public:
//类内声明
static int m_A;
//类内初始化则报错
//static int m_A = 1;
private:
//私有权限的静态成员属性
static int m_B;
};
//类外初始化,若不初始化则报错
int Person::m_A = 1;
int Person::m_B = 2;
void test()
{
Person p1;
Person p2;
//报错,显示成员不可访问
//cout << "m_B = " << p1.m_B << endl;
//cout << "m_B = " << Person::m_B << endl;
//p1,p2共享同一份静态成员属性。
//既可以通过对象访问,也可以通过类方式访问,根本原因在于静态成员在对象被创建之前就已经存在,属于类,而不属于对象。
p1.m_A = 10;
cout << "p1.m_A = " << p1.m_A << endl;
cout << "p2.m_A = " << p2.m_A << endl;
cout << "m_A = " << Person::m_A << endl << endl;
p2.m_A = 100;
cout << "p1.m_A = " << p1.m_A << endl;
cout << "p2.m_A = " << p2.m_A << endl;
cout << "m_A = " << Person::m_A << endl << endl;
Person::m_A = 1000;
cout << "p1.m_A = " << p1.m_A << endl;
cout << "p2.m_A = " << p2.m_A << endl;
cout << "m_A = " << Person::m_A << endl << endl;
}
int main()
{
test();
return 0;
}
二、静态成员方法
由一个类创建的所有对象共享同一份静态成员方法。
静态成员方法属于类但不属于由类创建的对象,所以既可以通过对象访问,也可以通过类方式访问。
静态成员方法只能访问静态成员属性。
class Person
{
public:
//静态成员属性
static int m_A;
//非静态成员属性
int m_B = 2;
static void func1()
{
m_A = 10;
//报错,只能访问静态成员属性
//根本原因在于静态成员在对象被创建之前就已经存在,属于类,而不属于对象。
//m_B = 20;
cout << "func1调用" << endl;
}
private:
//私有权限的静态成员方法
static void func2(int d)
{
cout << d << "func2调用" << endl;
}
};
int Person::m_A = 1;
void test()
{
Person p1;
Person p2;
//报错,显示成员不可访问
//p1.func2();
//Person::func2();
//p1,p2共享同一份静态成员方法。
//既可以通过对象访问,也可以通过类方式访问,根本原因在于静态成员在对象被创建之前就已经存在,属于类,而不属于对象。
p1.func1();
p2.func1();
Person::func1();
}
int main()
{
test();
return 0;
}