静态成员变量

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:

  • 静态成员变量
    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化
  • 静态成员函数
    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

示例1 :静态成员变量

  1. class Person
  2. {
  3. public:
  4. static int m_A; //静态成员变量
  5. //静态成员变量特点:
  6. //1 在编译阶段分配内存
  7. //2 类内声明,类外初始化
  8. //3 所有对象共享同一份数据
  9. private:
  10. static int m_B; //静态成员变量也是有访问权限的
  11. };
  12. int Person::m_A = 10;
  13. int Person::m_B = 10;
  14. void test01()
  15. {
  16. //静态成员变量两种访问方式
  17. //1、通过对象
  18. Person p1;
  19. p1.m_A = 100;
  20. cout << "p1.m_A = " << p1.m_A << endl;
  21. Person p2;
  22. p2.m_A = 200;
  23. cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据
  24. cout << "p2.m_A = " << p2.m_A << endl;
  25. //2、通过类名
  26. cout << "m_A = " << Person::m_A << endl;
  27. //cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
  28. }
  29. int main() {
  30. test01();
  31. system("pause");
  32. return 0;
  33. }
  1. class Person{
  2. public://类内声明:
  3. static int m_a;
  4. private:
  5. static int m_b; //类内不可对静态成员变量进行初始化
  6. };
  7. //类外初始化
  8. Person::m_a = 10;
  9. Person::m_b = 20;//类外全局可以访问到私有成员变量

静态成员变量共享同一份数据

  1. Person p1;
  2. Person p2;
  3. p1.m_a = 10;
  4. p1.m_a == p2.m_a

静态成员函数

物以类聚

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. static void fun() {
  8. m_a = 20; //函数是静态成员函数,能够调用的一定是静态成员变量;
  9. //m_c = 30;//非对象成员引用必须以特定类型相对
  10. //因为非静态的成员变量属于特定的对象,而静态成员变量是共有的,没有属于哪个对象的区别
  11. cout << "This a static function" << endl;
  12. }
  13. static int m_a;
  14. int m_c;
  15. private:
  16. static int m_b;
  17. };
  18. int Person::m_a = 0;
  19. int Person::m_b = 0;
  20. //int Person::m_c = 0;//非静态数据成员不能在其类的外部定义
  21. void test01()
  22. {
  23. Person p1;
  24. Person::fun();
  25. p1.fun();
  26. }
  27. int main() {
  28. test01();
  29. system("pause");
  30. return 0;
  31. }

示例2:静态成员函数

  1. class Person
  2. {
  3. public:
  4. //静态成员函数特点:
  5. //1 程序共享一个函数
  6. //2 静态成员函数只能访问静态成员变量
  7. static void func()
  8. {
  9. cout << "func调用" << endl;
  10. m_A = 100;
  11. //m_B = 100; //错误,不可以访问非静态成员变量
  12. }
  13. static int m_A; //静态成员变量
  14. int m_B; //
  15. private:
  16. //静态成员函数也是有访问权限的
  17. static void func2()
  18. {
  19. cout << "func2调用" << endl;
  20. }
  21. };
  22. int Person::m_A = 10;
  23. void test01()
  24. {
  25. //静态成员变量两种访问方式
  26. //1、通过对象
  27. Person p1;
  28. p1.func();
  29. //2、通过类名
  30. Person::func();
  31. //Person::func2(); //私有权限访问不到
  32. }
  33. int main() {
  34. test01();
  35. system("pause");
  36. return 0;
  37. }