我发现了很久以前回答的另一个问题,并没有真正理解其中一个答案。 Eddie's answer,在他的回答中他说如果您使用String mystring = 'x';
,那么x
将转换为int并致电String(int)
。为什么这个语句会调用构造函数?我认为为了使用构造函数,你必须使用像String mystring('x')
这样的语句。赋值运算符=
是否等同于创建对象的新实例?
答案 0 :(得分:3)
T t(x)
称为直接初始化,T t = x
称为复制初始化。复制初始化不使用赋值,即使使用=
。因为它是在声明时使用的,所以它是一种初始化形式。
在复制初始化期间,如果初始化程序的类型与正在创建的对象的类型不匹配,则 conversion-constructor 搜索并调用(如果可用)进行转换初始化器。结果是一个临时实例,它可以复制或移动构造到对象中。
例如,由于'x'
与String
的类型不匹配,因此会搜索相应的构造函数并用于将'x'
转换为String
实例。选择String::String(int)
构造函数,结果是临时实例String('x')
。然后(因为临时是一个右值),如果一个移动构造函数可用,临时将被移动构造成mystring
,否则复制构造。
如果有一个构造函数接受了2个参数,那么在这种情况下是否可以使用
=
?
是的,您可以使用 braced-initializer 来提供多个参数。它将为每个参数搜索最佳构造函数:
struct Square
{
Square(float width, float height);
};
int main()
{
// copy-initialization:
Square square = {2.5, 4.0}; // calls Square(2.5, 4.0)
}
但是请注意,如果有一个构造函数采用相同类型的std::initializer_list
,那么它将覆盖上面显示的行为:它将调用初始化列表构造函数。