我有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
可能有什么问题?在这种情况下如何调用=运算符?
答案 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
的方式是使用第二种初始化语法。