一. 静态成员变量
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
1. 示例
class Person
{
public:
static int m_A; //静态成员变量
//静态成员变量特点:
//1 在编译阶段分配内存
//2 类内声明,类外初始化
//3 所有对象共享同一份数据
private:
static int m_B; //静态成员变量也是有访问权限的
};
int Person::m_A = 10;
int Person::m_B = 10;
void test01()
{
//静态成员变量两种访问方式
//1、通过对象
Person p1;
p1.m_A = 100;
cout << "p1.m_A = " << p1.m_A << endl;
Person p2;
p2.m_A = 200;
cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据
cout << "p2.m_A = " << p2.m_A << endl;
//2、通过类名
cout << "m_A = " << Person::m_A << endl;
//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
}
int main() {
test01();
system("pause");
return 0;
}
2. 输出
p1.m_A = 100
p1.m_A = 200
p2.m_A = 200
m_A = 200
在C++中,静态成员变量与非静态成员变量有几个关键的区别,这解释了为什么所有对象共享静态成员变量的同一份数据:
a.全局性:静态成员变量是全局变量的一种特殊形式,它们在程序的整个运行期间都存在,并且不属于任何特定的对象实例。
b.共享性:静态成员变量属于类本身,而不是类的任何对象实例。因此,所有创建的该类的对象都共享同一个静态成员变量的副本。
c.存储:静态成员变量存储在程序的全局数据区,而不是对象的内存空间内。这意味着不论创建了多少个对象,静态成员变量都只有一个存储位置。
d.访问权限:尽管静态成员变量可以具有访问权限(如 private, protected, 或 public),它们仍然遵循静态成员的全局性规则。即使一个静态成员变量是 private 的,它仍然可以在类的成员函数内部被访问和修改,因为它是类的一部分。
变量 m_A 和 m_B 都是静态成员变量,它们在程序全局数据区分配了内存。当通过 p1.m_A 或 p2.m_A 修改 m_A 的值时,实际上是在修改全局数据区中 m_A 的值,因此所有通过 Person 类的对象访问 m_A 都会得到相同的值。
二. 静态成员函数
1. 示例
class Person
{
public:
//静态成员函数特点:
//1 程序共享一个函数
//2 静态成员函数只能访问静态成员变量
static void func()
{
cout << "func调用" << endl;
m_A = 100;
//m_B = 100; //错误,不可以访问非静态成员变量
}
static int m_A; //静态成员变量
int m_B; //
private:
//静态成员函数也是有访问权限的
static void func2()
{
cout << "func2调用" << endl;
}
};
int Person::m_A = 10;
void test01()
{
//静态成员变量两种访问方式
//1、通过对象
Person p1;
p1.func();
//2、通过类名
Person::func();
//Person::func2(); //私有权限访问不到
}
int main() {
test01();
system("pause");
return 0;
}
2. 输出
func调用
func调用
三. 总结
- 静态成员变量
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量