C ++ 11构造函数和运算符=的统一初始化

时间:2015-05-28 23:34:11

标签: c++ c++11 initialization

我有T类和表使用T作为构造参数。

struct T {
    string name;
    long value;
};

class Table {

public:
    T a, b, c;

    Table(T a, T b, T c) {
        cout << "From constructor: " << a.name << endl;
        this->a = a; this->b = b; this->c = c;
    }
    Table& operator=(const Table& a) {
        cout << "In op=: " << a.a.name << endl;
        return *this;
    }
};

我还有一个尝试调用构造函数和=运算符的示例函数。

int main(int argc, char *argv[]) {   
    Table phone_numbers {
        { "Donald Duck", 2015551234 },
        { "Mike Doonesbury", 9794566089 }, 
        { "Kell Dewclaw", 1123581321 }
        };
    Table phone_numbers2 = {
        { "Donald Dog", 2015551234 },
        { "Mike Doonesbury", 9794566089 }, 
        { "Kell Dewclaw", 1123581321 }
        };

}

但是它们都只调用构造函数。

From constructor: Donald Duck
From constructor: Donald Dog

可能有什么问题?在这种情况下如何调用=运算符?

2 个答案:

答案 0 :(得分:4)

operator=用于分配,而不是初始化。为了激发这一点,你必须分配给一个已经存在的对象。

Table t = {blah, blah};   // initialisation
t = {wibble, wobble};     // assignment

答案 1 :(得分:0)

8.5初始化[dcl.init]

  

声明者可以指定标识符的初始值   声明。标识符指定要初始化的变量。该   8.5的其余部分描述的初始化过程适用   也适用于其他语法上下文指定的初始化   作为带参数表达式的函数参数的初始化   (5.2.2)或返回值的初始化(6.6.3)。

initializer:
    brace-or-equal-initializer
    ( expression-list )

brace-or-equal-initializer:
    = initializer-clause
    braced-init-list

initializer-clause:
    assignment-expression
    braced-init-list

initializer-list:
    initializer-clause ... opt
    initializer-list , initializer-clause ... opt

braced-init-list:
    { initializer-list , opt }
    {}  

构造phone_numbers2的方式是使用第二种初始化语法。