• c++ 学习之 静态成员变量和静态成员函数


    前言

    静态成员分为
    1)静态成员变量

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

    正文

    静态成员变量

    初始化操作

    • 静态变量要进行初始化操作,不然使用的时候会报错
      我们来看看下面的代码:
    #define CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    
    class Person {
    public:
    
    	static int m_A;
    
    };
    
    void test()
    {
    	Person p;
    	cout << p.m_A << endl;
    }
    
    int main()
    {
    	test();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    上面的代码会报错,因为调用 p.m_A 的时候由于它没有被赋初值,所以会报错
    在这里插入图片描述
    那怎么解决这个问题呢?
    可以在类内初始化吗?
    答案是不可以
    在这里插入图片描述
    那究竟该如何初始化呢
    我们要在类外初始化
    在这里插入图片描述
    这样就解决问题了

    如何理解共享一份数据

    看完下面这个代码和运行结果你就会了解了

    #define CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    
    // 静态成员分为
    // 1)静态成员变量
    // * 所有对象共享一份数据
    // * 在编译阶段分配空间
    // * 类内声明,类外初始化
    // 2)静态成员函数
    // * 所有对象共享一个函数
    // * 静态成员函数只能访问静态成员变量
    
    class Person {
    public:
    	// 类内声明
    	static int m_A ;
    
    };
    
    // 类外初始化操作
    int Person::m_A = 100;
    
    void test()
    {
    	Person p;
    	cout << p.m_A << endl;
    
    	// 再实例化一个对象
    	Person B;
    	cout << B.m_A << endl;
    
    	B.m_A = 200;
    	cout << p.m_A << endl;
    	cout << B.m_A << endl;
    }
    
    int main()
    {
    	test();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述
    静态成员变量的访问方式有两种

    #define CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    
    // 静态成员分为
    // 1)静态成员变量
    // * 所有对象共享一份数据
    // * 在编译阶段分配空间
    // * 类内声明,类外初始化
    // 2)静态成员函数
    // * 所有对象共享一个函数
    // * 静态成员函数只能访问静态成员变量
    
    class Person {
    public:
    	// 类内声明
    	static int m_A ;
    
    };
    
    // 类外初始化操作
    int Person::m_A = 100;
    
    void test()
    {
    	Person p;
    	cout << p.m_A << endl;
    
    	// 再实例化一个对象
    	Person B;
    	cout << B.m_A << endl;
    
    	B.m_A = 200;
    	cout << p.m_A << endl;
    	cout << B.m_A << endl;
    }
    
    void test02()
    {
    	// 静态成员变量 不属于某个对象上,所有对象都共享同一份对象
    	// 因此静态成员变量有两种访问方式
    
    	// 1.通过对象进行访问
    	Person p;
    	cout << p.m_A << endl;
    	// 2.通过类名进行访问
    	cout << Person::m_A << endl;
    }
    
    int main()
    {
    	//test();
    	test02();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    访问权限

    如果静态成员变量是在 private 属性的,那么类外无法访问
    在这里插入图片描述
    在类外中 m_B 无法被访问

    静态成员函数

    访问方式

    有两种访问方式

    #define CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;
    
    // 静态成员分为
    // 1)静态成员变量
    // * 所有对象共享一份数据
    // * 在编译阶段分配空间
    // * 类内声明,类外初始化
    // 2)静态成员函数
    // * 所有对象共享一个函数
    // * 静态成员函数只能访问静态成员变量
    
    class Person
    {
    public:
    	// 静态成员函数
    
    	static void fun()
    	{
    		cout << " static void fun 函数 调用  " << endl;
    	}
    };
    
    // 有两种访问方式
    void test01()
    {
    	// 1.通过对象访问
    	Person p;
    	p.fun();
    	
    	// 2.通过类名访问
    	Person::fun();
    }
    
    int main()
    {
    	test01();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    静态成员函数只能访问静态成员变量

    class Person
    {
    public:
    	// 静态成员函数
    
    	static void fun()
    	{
    		cout << " static void fun 函数 调用  " << endl;
    		m_A = 100;  //(正确) 静态成员函数可以访问 静态成员函数
    		m_B = 100;  // (错误) 静态成员函数不可以访问 非静态成员函数,无法区分是哪个实例的 m_B
    	}
    
    	static int m_A;   //静态成员变量
    	int m_B;   // 非静态成员变量
    };
    int Person::m_A = 10;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    访问权限

    如果静态成员函数是 private 权限下的,外部也不能访问

  • 相关阅读:
    【2023】某python语言程序设计跟学第八周内容
    Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
    MybatisPlus--基础入门!真滴方便
    Springboot集成MongoDB存储文件、读取文件
    Haproxy搭建 Web 群集实现负载均衡
    Redis核心设计原理(深入底层C源码)
    16. 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
    Python爬虫(三)
    Python数据结构——队列
    Java程序员找工作需要掌握哪些技能
  • 原文地址:https://blog.csdn.net/wniuniu_/article/details/132768054