zoukankan      html  css  js  c++  java
  • [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;
    };
  • 相关阅读:
    技术学习博2
    正则匹配两个特定词组中间的内容的写法
    springboot mitre HTTP Proxy Servlet POST hang timeout 不执行的解决方案
    JAVA实现的HTTP反向代理 [smiley-http-proxy-servlet]学习
    get方式url传递map的写法,control传入map数据url格式&params[key]=value&params[key2]=value2
    angular7 学习笔记记录--1. TypeScript基础
    Operator '>' cannot be applied to types 'boolean' and 'number'?
    记录在linux环境redis如何重启版本5.x
    ElasticSearch (with docker )入门学习
    Dataway【实测】,让服务飞起来,让SpringBoot不再需要Controller、Service、DAO、Mapper
  • 原文地址:https://www.cnblogs.com/hustcser/p/4121624.html
Copyright © 2011-2022 走看看