• C++零碎记录(五)


    9. 静态成员

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

    ② 静态成员分为:

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

    ③ 调用静态成员函数有两种方法:

    1. 通过对象调用
    2. 通过类名调用

    9.1 静态成员变量

    1. #include<iostream>
    2. using namespace std;
    3. //静态成员变量
    4. class Person
    5. {
    6. public:
    7. //1、所有对象都共享同一份数据
    8. //2、编译阶段就分配内存
    9. //3、类内声明,类外初始化操作
    10. static int m_A;
    11. //静态成员变量也是有访问权限的
    12. private:
    13. static int m_B;
    14. };
    15. int Person::m_A = 100;
    16. void test01()
    17. {
    18. Person p;
    19. cout << p.m_A << endl;
    20. Person p2;
    21. p2.m_A = 200;
    22. //100 ? 200,共享同一份数据,所以p.m_A为200
    23. cout << p.m_A << endl;
    24. }
    25. void test02()
    26. {
    27. //静态成员变量 不属于某个对象上,所有对象都共享同一份数据
    28. //因此静态成员变量有两种访问方式
    29. //1、通过对象进行访问
    30. Person p;
    31. cout << p.m_A << endl;
    32. //2、通过类名进行访问
    33. cout << Person::m_A << endl;
    34. //cout << Person::m_B << endl; //报错,私有作用域,出了类是不可以访问的
    35. }
    36. int main()
    37. {
    38. test01();
    39. test02();
    40. system("pause");
    41. }

    运行结果:

    • 100
    • 200
    • 200
    • 200
    • 请按任意键继续. . .

    9.2 静态成员函数

    1. #include <iostream>
    2. using namespace std;
    3. //静态成员函数
    4. //所有对象共享同一个函数
    5. //静态成员函数只能访问静态成员变量
    6. class Person
    7. {
    8. public:
    9. //静态成员函数
    10. static void func()
    11. {
    12. m_A = 100; //静态成员函数可以访问静态成员变量,这个数据是共享的,只有一份,所以不需要区分哪个对象的。
    13. //m_B = 200; //静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的m_B属性,非静态成员变量属于特定的对象上面
    14. cout << "static void func调用" << endl;
    15. }
    16. static int m_A; //静态成员变量
    17. int m_B; //非静态成员变量
    18. //静态成员函数也是有访问权限的
    19. private:
    20. static void func2()
    21. {
    22. cout << "static void func2调用" << endl;
    23. }
    24. };
    25. int Person::m_A = 0;
    26. //有两种访问方式
    27. void test01()
    28. {
    29. //1、通过对象访问
    30. Person p;
    31. p.func();
    32. //2、通过类名访问
    33. Person::func(); //静态成员函数,所有对象共享同一个函数,可以直接通过类名访问。
    34. //Person::func2(); //类外访问不到私有静态成员函数
    35. }
    36. int main()
    37. {
    38. test01();
    39. system("pause");
    40. return 0;
    41. }

    运行结果:

    • static void func调用
    • static void func调用
    • 请按任意键继续. . .

    9.3 成员变量和成员函数分开存储

    ① 在C++中,类内对的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。

    1. #include <iostream>
    2. using namespace std;
    3. class Person01
    4. {
    5. public:
    6. };
    7. class Person02
    8. {
    9. public:
    10. int m_A; //非静态成员变量 属于类的对象上
    11. static int m_B; //静态成员变量 不属于类对象上
    12. //void fun(){} //非静态成员函数 不属于类对象上
    13. static void func2() {} //静态成员函数 不属于类的对象上
    14. };
    15. int Person02::m_B = 0;
    16. void test01()
    17. {
    18. Person01 p;
    19. //空对象占用内存空间为:1
    20. //C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
    21. //每个空对象也应该有一个独一无二的内存空间
    22. cout << "size of p = " << sizeof(p) << endl;
    23. }
    24. void test02()
    25. {
    26. Person02 p2;
    27. cout << "size of p2 = " << sizeof(p2) << endl; //通过打印内存空间大小,检测静态成员变量、非静态成员函数等在不在对象内存上....
    28. }
    29. int main()
    30. {
    31. test01();
    32. test02();
    33. system("pause");
    34. return 0;
    35. }

    运行结果:

    • size of p = 1
    • size of p2 = 4
    • 请按任意键继续. . .

    链接:https://www.zhihu.com/question/437657370/answer/1692846096

  • 相关阅读:
    基于ChatGPT的视频智能摘要实战
    营收再涨,瑞幸翻身把歌唱?
    用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)
    阿里云ECS服务器如何搭建并连接FTP,完整步骤
    OceanBase 里的 schema 是什么?
    Java练习题-用冒泡排序法实现数组排序
    AI人工智能—数据标注的主要类型和标注注意事项
    Qt 定制专属闹钟
    20221113 今天的世界发生了什么
    C++初阶 List的模拟实现
  • 原文地址:https://blog.csdn.net/qq18218628646/article/details/132706799