美文网首页
深入理解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