• C++ static静态成员


    01 基本概念

    静态成员:在定义前面加了static关键词的成员。

    class A
    {
    public:
        A(int a, int b):m_a(a),m_b(b)
        {
            num += m_a + m_b;
        }
        
        ~A(){ }
        
        void Fun();             // 普通成员函数
        static void PrintNum()  // 静态成员函数
        {
            // 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数
            std::cout << num << std::endl; 
        }
        
    private:
        int m_a;         // 普通成员变量
        int m_b;         // 普通成员变量
        static int num;  // 静态成员变量
    };
    
    // 静态成员必须在定义类的文件中对静态成员变量进行初始化,否则会编译出错。
    int A::num = 0;
    
    int main()
    {
        A a1(1,1);
        A::PrintNum(); // 访问静态函数
        A a2(1,1);
        A::PrintNum(); // 访问静态函数
        
        return 0;
    }
    

    输出结果

    2
    4
    
    • 普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。

    这里需要注意的是sizeof运算符不会计算静态成员变量的大小,如下栗子:

    class CTest
    {
        int n;
        static int s;
    };
    

    sizeof(CTest)等于4

    • 普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象
    • 因此静态成员不需要通过对象就能访问,因为他是共享的。

    02 如何访问静态成员

    1) 类名::成员名

    A::PrintNum();
    

    2) 对象名.成员名

    A a;
    a.PrintNum();
    

    3) 指针->成员名

    A *p = new A();
    p->PrintNum();
    

    4) 引用.成员名

    A a;
    A & ref = a;
    ref.PrintNum();
    

    03 小结

    • 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
    • 静态成员函数本质上是全局函数。
    • 设置静态成员这种机制的目的是将和某些紧密相关的全局变量和函数写在类里面,看上去像是一个整体,易于维护和理解。
    • 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
    • 静态成员必须在定义类的文件中对静态成员变量进行初始化,否则会编译出错。

  • 相关阅读:
    一年三百六十日,需求业务严相逼
    新博客测试
    教务流水账
    暗流涌动的话“用户体验”
    文档那些事儿
    jforum(2)中文乱码的解决方式
    jmeter笔记(4)测试上传附件
    jmeter笔记(2)组件介绍
    jmeter笔记(5)参数化CSV Data Set Config
    jmeter笔记(6)参数化函数助手
  • 原文地址:https://www.cnblogs.com/xiaolincoding/p/11954907.html
Copyright © 2020-2023  润新知