• [015]staic成员及staic成员函数


         C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系.

         谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:

    class Sum {
    public:
        Sum() {num++; sum+=num;}
        static void Reset() {num = 0; sum = 0;}
        static int GetSum() {return sum;}
    private:
        static int num;
        static int sum;
    };

    需要特别注意的是:

      在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!

      而且static数据成员不是通过类构造函数进行初始化的,它的成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了

    int Sum::num = 0;
    int Sum::sum = 0;

    我们甚至可以这样使用:

    int SS(int i) {
        Sum::Reset();           // 没有实例对象,却可以在这里使用
        Sum *p = new Sum[i];
        delete []p;
        p = NULL;
    
        return Sum::GetSum();   // 没有实例对象,却可以在这里使用
    }

    说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。

    如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int或者const char型的,换成const string ,double都不行。

    class Sum {
    public:
        Sum() {num++; sum+=num;}
        static void Reset() {num = 0; sum = 0;}
        static int GetSum() {return sum;}
    private:
        static int num;
        static int sum;
        static const int i = 10;        // ok
        static const char i = 10;       // ok
        static const double i = 10;     //Error
        static const string i = 10;     //Error
    };

    在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。

    说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。

    class Sum {
    public:
        Sum() {num++; sum+=num;}
        static void Reset() {num = 0; sum = 0;}
        static int GetSum() {
            return sum;          // OK 因为是static成员
            return i;            // Error 因为非static
        }
    private:
        static int num;
        static int sum;
        int i;
    };
  • 相关阅读:
    ElasticSearch 2 (1)
    Vagrant (2) —— 基本安装与配置(下)
    Vagrant (1) —— 基本安装与配置(上)
    Vagrant (3) —— 复制/备份Vagrant Box
    vue中$forceUpdate的使用
    vue+ElementUi 选择框选中之后翻页进行状态保持及默认选中
    loonflow 工单系统
    一些后端知识
    前端学习计划
    async/await函数的执行顺序的理解
  • 原文地址:https://www.cnblogs.com/hustcser/p/4121624.html
Copyright © 2020-2023  润新知