C++11--可以这么玩初始化列表吗?

来源:互联网 发布:mac下常用软件 编辑:程序博客网 时间:2024/06/11 23:47

我们知道C++11新增了初始化列表,在之前的博客中也有过介绍。
浅析C++中的初始化列表(区别赋值和初始化)
c++11特性之initializer_list

今天就讨论这么用初始化列表,不喜勿喷。

先写一个类:

class SimpleType{private:    int a { 1 };    // << wow!    int b { 1 };    // << wow2!    string name { "string" }; // wow3!public:    SimpleType() {        cout << "SimpleType::ctor, {"                   << a << ", "                   << b << ", \""                   << name << "\"}"                   << endl;    }    ~SimpleType() {         cout << "SimpleType::destructor" << endl;     }};

使用这个类:

SimpleType obj;

输出:
SimpleType::ctor, {1, 1, “string”}

来说说什么这么写有用:
1简洁
2你不会忘记初始成员变量
3当你有好几个构造函数的时候,这么写更有好处

对上面的类就行简单的修改:

class SimpleType{private:    int a { 1 };    // << wow!    int b { 1 };    // << wow2!    string name { "string" }; // wow3!public:    SimpleType() { /* old code... */ }    SimpleType(int aa, int bb)         : a(aa), b(bb) // << custom init!    {    std::cout << "SimpleType::ctor(aa, bb), {"          << a << ", "         << b << ", \""         << name << "\"}"         << std::endl;    }    ~SimpleType() {         cout << "SimpleType::destructor" << endl;     }};

对修改后的类进行使用:

class AdvancedType{private:    SimpleType simple;public:    AdvancedType() {        cout << "AdvancedType::ctor" << endl;    }    AdvancedType(int a) : simple(a, a) {        cout << "AdvancedType::ctor(a)" << endl;    }    ~AdvancedType() {         cout << "AdvancedType::destructor" << endl;     }};

使用:

AdvancedType adv;

输出:

SimpleType::ctor, {1, 1, "string"}AdvancedType::ctor

使用:

AdvancedType advObj2(10);

输出:

SimpleType::ctor(aa, bb), {10, 10, "string"}AdvancedType::ctor(a)

副作用:
想要一个空的成员变量的时候,比如vector等等。

0 0