美文网首页
深入理解C++11 2.7 快速初始化成员变量

深入理解C++11 2.7 快速初始化成员变量

作者: zinclee123 | 来源:发表于2019-08-08 19:05 被阅读0次

    C++98中,支持在类声明的时候使用等号"="初始化类中静态成员常量,这种声明方式我们称之为"就地"声明。但是C++98要求静态成员必须满足常量性,而且类型必须是整型或者枚举型,而非静态成员变量的初始化则必须在构造函数中进行。如:

    class Init{
    public:
        Init(): a(0){}
        Init(int d): a(d){}
    private:
        int a;
        const static int b = 0;
        int c = 1;                 //成员,无法通过编译
        static int d = 0;           //成员,无法通过编译
        static const double e = 1.3; //非整型或者枚举型,无法通过编译
        static const char* const f = "e"; //非整型或者枚举型,无法通过编译
    };
    

    在C++11中,允许使用等号=或者花括号{}进行就地的非静态成员变量初始化。如:

    struct C {
        C(int i, int j):c(i),d(j) {};
        int c;
        int d;
    };
    
    struct init {
        int a = 1;
        string b{"hello"};
        C c{1, 3};
    };
    

    需要注意的是,初始化列表的效果总是优先于就地初始化的。如

    struct C {
        C() {};
        C(int i):c(i) {};
        int c = 2;
    };
    
    int main(){
        C c1;
        
        C c2(500);
        
        cout << c1.c << endl; //输出2
        cout << c2.c << endl; //输出500
        
        return 0;
    }
    

    另外对于非常量的静态成员变量,C++11与C++98保持一致,还是要在头文件以外的的位置定义它,这会保证编译时,类静态成员的定义最后只存在于一个目标文件中。如:

    struct C {
        C() {};
        C(int i):c(i) {};
        int c = 2;
        static int d = 3;//报错 Non-const static data member must be initialized out of line
    };
    

    相关文章

      网友评论

          本文标题:深入理解C++11 2.7 快速初始化成员变量

          本文链接:https://www.haomeiwen.com/subject/zzjfjctx.html