• 静态成员数据和静态成员函数


      在c++中,经常可以看到static开头的语句,那么这就是在定义静态成员数据或者静态成员函数了。

      

    静态成员数据

      类中的某个数据一旦被定义为静态成员数据,那么这个数据就可以被由这个类创建的任何对象共享。这个数据就是静态成员数据。

      注意:一般,类只是定义了其结构、类型,而创建对象时才会分配内存空间。比如一个Student类,其中有一个成员数据totalNumber,且由这个类创建了10个对象,则就会开辟十个相应的空间存储对象,且totalNumber被存在了这个十个对象,处于不同的位置,然而,totalNumber是相同的,如果存储了10份,就会造成浪费,所以出现了静态成员数据的概念。但是,这个静态数据成员只能在类之外进行初始化,在类的里面是不能进行初始化的。 且对静态成员数据访问时,既可以通过创建的对象访问(使用 . 访问符),也可以使用这个类来进行访问(使用 :: 进行访问),举例如下:

      

    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Student
    {
    public:
        static int totalNumber;
        int getAge()
        {
            return this->age;
        }
        Student(string name = "wayne", int age = 22, string sex = "male")
        {
            name = name;
            age = age;
            sex = sex;
            // 每创建一次对象,totalNumber值加1
            totalNumber++;
        }
    
        
    private:
        string name;
        int age;
        string sex;
    };
    
    int Student::totalNumber = 0;
    
    int main()
    {
        cout << "this is the beginning!" << endl;
        Student wayne("wayne", 22, "male");
        Student hedy("hedy", 18, "female");
        Student brother("brother", 24, "male");
        cout << "创建的学生总数为:" << Student::totalNumber << endl;
        cout << "创建的学生总数为:" << wayne.totalNumber << endl;
        return 0;
    }

    如上所示:

    • 我们定义了Student类,并且设置了totalNumber为静态成员函数,并且静态成员函数在类之外初始化,而不能在类里初始化。
    • getAge中使用了this->age,因为这些数据成员是有this指针的,另外注意我们构造函数的使用。
    • 因为totalNumber是静态成员函数,所以我们可以使用 类::静态成员函数 的方式访问。另外,我们通过 对象.成员函数 也是可以访问的,并且最终结果相同。

         

    静态成员函数

      静态成员函数同样也是在类中的函数前加上 static 关键词。同样的,静态成员函数可以通过 类名::静态成员函数 的方式进行访问。

      静态成员函数不能访问类中的一般函数和数据,只能访问类中的静态成员函数,静态成员变量,或者类外的其他函数,这是因为静态成员函数中是没有this指针的。 

      如下所示:

    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Student
    {
    public:
        static int totalNumber;
        int getAge()
        {
            return this->age;
        }
        Student(string name = "wayne", int age = 22, string sex = "male")
        {
            name = name;
            age = age;
            sex = sex;
            // 每创建一次对象,totalNumber值加1
            totalNumber++;
        }
        static int getTotal()
        {
            return totalNumber;
        }
    
        
    private:
        string name;
        int age;
        string sex;
    };
    
    int Student::totalNumber = 0;
    
    int main()
    {
        cout << "this is the beginning!" << endl;
        Student wayne("wayne", 22, "male");
        Student hedy("hedy", 18, "female");
        Student brother("brother", 24, "male");
        cout << "创建的学生总数为:" << Student::getTotal() << endl;
        cout << "创建的学生总数为:" << wayne.getTotal() << endl;
        return 0;
    }

      可以看到: 上面的程序中,我们可以使用静态成员函数getTotal访问静态成员数据,并且,同样的,静态成员函数是属于类的,无论创建了多少对象,都只会占用一份内存。且可以通过两种方式来进行访问。 

          

      

  • 相关阅读:
    kubernetes中跨namespace的服务调用 & 外部服务调用 & host配置
    pm2 ——带有负载均衡功能的Node应用的进程管理器
    Linux——docker启用配置:dockerfile——ubuntu
    .net core 单元测试——sonar
    Linux——工具参考篇(3)——ps 进程查看器
    开发框架
    Django框架 + Djiango安装 + First Djiango + 常用命令
    计算机网络知识点随机整理
    Ubuntu tricks
    Python 图片Resize.py
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/8584504.html
Copyright © 2020-2023  润新知