02-8-1 静态成员变量
静态成员变量的特点:
-
所有对象共享一份数据;
-
在编译阶段分配内存(一般的数据存放在栈区)
相当于在运行可执行文件前就已经分配完成了。(在 windows 环境下
.exe
就是可执行文件)(静态成员变量数据存放在全局区) -
类内声明,类外初始化
-
所有对象共享一份数据
#include
using namespace std; //静态成员变量 class Person { public: static int m_A; }; int Person::m_A = 10; int main() { class Person p1; cout << "p1.m_A=" << p1.m_A << endl; class Person p2; p2.m_A = 100; cout << "p1.m_A=" << p1.m_A << endl; return 0; } 在这里,
p2
修改了属性m_A
,但是m_A
是一个静态成员变量,静态成员变量有一个特点就是所有对象共享一份数据。所以当我们再次打印p1.m_A
的数据值的时候,也会显示为100
。静态成员变量不属于某个对象上,因为所有对象都共享同一份数据。因此,静态成员对象有两种访问方式。
-
通过对象进行访问
int Person::m_A = 10; int main() { class Person p; cout << p.m_A << endl; return 0; }
-
通过类名进行访问
int Person::m_A = 10; int main() { cout << Person::m_A << endl; return 0; }
当然,这里的访问只是使用了
cout
来示例,比如说需要重新赋值,Person::m_A = 100;
也是凑效的。静态成员对象也是有访问权限的。
比如将一个静态成员对象定义在
private
(私有)权限下:class Person { public: static int m_A; private: static int m_B; }; int Person::m_A = 10; int Person::m_B = 20; int main() { cout << Person::m_A << endl; //cout << Person::m_B << endl; return 0; }
在这里,想要打印
m_B
是会报错的。报错内容如下:成员 "Person::m_B" (已声明 所在行数:xx) 不可访问
类外访问不到私有的静态成员对象。
-
-
类内声明,类外初始化
创建一个静态成员对象很简单,只要在成员对象前添加关键在
static
。class Person { public: static int m_A; };
在类外初始化的意思是:不可以在类的代码块内。
比如说
class Person { public: static int m_A; }; int Person::m_A = 100; int main() { return 0; }
或者是:
class Person { public: static int m_A; }; int main() { int Person::m_A = 100; return 0; }
需要注意的是:
- 首次初始化需要声明数据类型。如上面的例子就是:
int Person::m_A = 100;
。之后赋值不需要重新声明数据类型。 - 在非类内,需要声明作用域。上面的例子中就是:
Person::m_A
。
总结:
- 静态成员变量的特点
- 所有对象共享一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员变量的访问方式
- 通过对象进行访问
- 通过类名进行访问
- 静态成员变量也遵守相应的权限管理。
- 首次初始化需要声明数据类型。如上面的例子就是:
:-)