静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
静态成员变量
- 所有对象共享一份数据
- 在编译阶段分配内存
- 类内声明,内外初始化
静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量
静态成员变量演示:
class Person { public: static int m_A; }; int Person::m_A = 100;//内外进行声明 void test01() { Person p; cout << p.m_A << endl; Person p2; p2.m_A = 200; cout << p2.m_A << endl; cout << p.m_A << endl; } int main() { test01(); return 0; }
这段代码输出的结果是:
为什么前后两个p.m_A输出的结果会不一样呢?因为在Person类中创建的是一个静态变量,所有成员都共享一份数据,当执行p2.m_A = 200;时,p.m_A的值也会发生改变。
静态成员变量可以通过对象进行访问,也可以通过类名进行访问(非静态成员变量不行):
class Person { public: static int m_A; }; int Person::m_A = 100; void test02() { Person p; cout << p.m_A << endl; //1.通过对象进行访问 cout << Person::m_A << endl; //2.通过类名进行访问问 } int main() { test02(); return 0; }
两种方式访问的输出结果:
静态成员函数和静态成员变量类似,可以通过对象进行访问,也可以通过类名进行访问
静态成员函数演示:
class Person { public: static void func() { cout << "static void func调用" << endl; } }; void test01() { //1.通过对象进行访问 Person p; p.func(); //2.通过类名进行访问 Person::func(); } int main() { test01(); return 0; }
静态成员函数只能访问静态成员变量:
class Person { public: static void func() { m_A = 100; //静态成员函数 能访问静态成员变量 //m_B = 200; //静态成员函数 不可已访问 非静态成员变量 cout << "static void func调用" << endl; } static int m_A; int m_B; }; int Person::m_A = 0;
原因:静态成员变量是所有对象共享的,如果让静态成员函数访问非静态成员变量m_B时,无法区分m_B是属于哪个对象的
注意:静态成员变量和静态成员函数和普通变量一样,都有访问权限。