• C++static静态成员变量


    有时候我们希望在多个对象之间共享数据,对象 a 改变了某数据后对象 b 可以检测到。共享数据的典型使用场景是计数 

    以 Student 类为例,如果我们想知道班级中共有多少名学生,就可以设置一份共享的变量,每次创建对象时让该变量加 1

    在C++中,我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量,它被关键字static修饰

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Student {
    public:
        Student(const string& name1, int age1) {
    
          }
    public:
       static int m_total;  //静态成员变量
       /*
         static 成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为 m_total 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 m_total,也会影响到其他对象
       static 成员变量必须在类声明的外部初始化:
       格式:变量类型 类名::变量名 = 初始化值;
       static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存
       */
     private:
        string m_name;
        int m_age;
     };
    int Student::m_total = 0;  //初始化静态成员变量
    //静态成员变量在初始化时不能再加 static,但必须要有数据类型。被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化
    //注意:static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用
    
    
    int main()
    {
        //static 成员变量既可以通过对象来访问,也可以通过类来访问
        Student::m_total = 10;  //通过类访问
    
        Student stu("张三", 25);
        stu.m_total = 20;  //通过对象来访问
    
        Student* pstu = new Student("李华", 16);
        pstu->m_total = 30;  //通过对象指针来访问
    
        cout << Student::m_total << endl;
    
        return(0);
    }

    完整的例子:计数功能

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Student {
    public:
        Student(const string& name1, int age1) {
            m_name = name1;
            m_age = age1;
                m_total++;
          }
    public:
       static int m_total; 
      
     private:
        string m_name;
        int m_age;
     };
    int Student::m_total = 0;
    int main()
    {
        Student s1("张三", 15);
        Student s2("李明", 52);
        Student s3("李四", 15);
        
        cout << Student::m_total << endl;
    
        return(0);
    }

    特殊场景:static、const同时修饰的成员变量

    #include <iostream>
    using namespace std;
    
    class A {
    public:
        A(int i=0)/*:spec(i) 错 */{}
        static const int spec=10;  //
    };
    
    //int A::spec = 10; //
    /*
    上面两处错误原因:修饰符static只能在类外初始化,修饰符const(引用、类对象)只能用初始化列表初始化,两者相互矛盾
    解决办法:只能在声明时初始化
    */
    
    int main() {
        
        
    
        return 0;
    }

  • 相关阅读:
    二维几何前置知识
    点分治学习笔记
    $fhq-treap$学习笔记
    对拍使用方法
    2021.2.18-2021.5.18 三个月后端开发实习的学习路径
    蓝桥杯常考算法 + 知识点
    Linux
    Linux
    Intern Day112
    Linux上编译运行C/C++程序
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13522108.html
Copyright © 2020-2023  润新知