静态成员:
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
-
静态成员变量
- 所有对象共享同一份数据(不属于某一个对象,两个对象,一个修改了,另一个也会跟着改)两种方式访问:通过创建对象访问,通过类名作用域访问
- 在编译阶段分配内存(全局区)
- 类内声明,类外初始化(必须得有初始值,不然没法用)
-
静态成员函数
- 所有对象共享同一个函数(两种方式访问:通过创建对象访问,通过类名作用域访问)
- 静态成员函数只能访问静态成员变量
/
这里记录下静态成员函数的一个注意事项。
/
静态成员函数
特点:
1 程序共享一个函数
2 静态成员函数 只能 访问静态成员变量
class Person
{
public:
//静态成员函数特点:
//1 程序共享一个函数
//2 静态成员函数 只能 访问静态成员变量
static void func()
{
cout << "func调用" << endl;
m_A = 100; //静态成员函数可以访问 静态成员变量
// m_B = 200; //错误,不可以访问非静态成员变量
//原因:无法区分到底是哪个对象的m_B属性
}
static int m_A; //静态成员变量 类内声明 不属于某个特定的对象
int m_B; //非静态成员变量 属于某个特定的对象
};
静态成员函数只能访问静态成员变量 m_A
,而不可以访问非静态成员变量m_B
,否则会报错:
error: invalid use of member ‘Person::m_B’ in static member function
原因在于:
静态成员变量不属于某个特定的对象;
非静态成员变量属于某个特定的对象,必须用对象来访问。
当调用静态成员函数func
时,函数体内部有代码:m_B = 200;
但是它不知道是改变的哪个对象的m_B
,比如用Person类创建了两个对象p1和p2,这两个对象分别有一个m_B
的值,函数体内无法体现出是m_B
是p1的成员还是p2的成员,函数体不知道要改变p1的还是p2的值,因此静态成员函数无法访问非静态成员变量。