C++11 构造函数和 operator= 的统一初始化
C++11 Uniform initialization for constructor and operator=
我有 T class 和使用 T 作为构造参数的 Table。
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
可能出了什么问题?在这种情况下如何调用 = 运算符?
operator=
用于赋值,而不是初始化。要激发这一点,您必须分配给一个已经存在的对象。
Table t = {blah, blah}; // initialisation
t = {wibble, wobble}; // assignment
8.5 初始化器 [dcl.init]
A declarator can specify an initial value for the identifier being
declared. The identifier designates a variable being initialized. The
process of initialization described in the remainder of 8.5 applies
also to initializations specified by other syntactic contexts, such
as the initialization of function parameters with argument expressions
(5.2.2) or the initialization of return values (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
的方式是使用第二种初始化语法。
我有 T class 和使用 T 作为构造参数的 Table。
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
可能出了什么问题?在这种情况下如何调用 = 运算符?
operator=
用于赋值,而不是初始化。要激发这一点,您必须分配给一个已经存在的对象。
Table t = {blah, blah}; // initialisation
t = {wibble, wobble}; // assignment
8.5 初始化器 [dcl.init]
A declarator can specify an initial value for the identifier being declared. The identifier designates a variable being initialized. The process of initialization described in the remainder of 8.5 applies also to initializations specified by other syntactic contexts, such as the initialization of function parameters with argument expressions (5.2.2) or the initialization of return values (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
的方式是使用第二种初始化语法。