我发现了另一个很久以前就回答过的问题,但我并不真正理解其中的一个答案。埃迪(Eddie)的回答中,他说,如果您使用的String mystring = 'x';
话,x
它将被转换为一个int和call String(int)
。为什么此语句调用构造函数?我认为,要使用构造函数,您必须使用类似的语句String mystring('x')
。赋值运算符是否=
等效于创建对象的新实例?
T t(x)
称为直接初始化,T t = x
称为复制初始化。复制初始化甚至不使用赋值=
。因为它是在声明时使用的,所以它是一种初始化形式。
在复制初始化期间,如果初始化程序的类型与要创建的对象的类型不匹配,则将搜索并调用转换构造函数(如果有)以转换初始化程序。结果是一个临时实例,该实例可以复制或移动构造到对象中。
例如,由于'x'
与的类型不匹配String
,因此将搜索适当的构造函数并将其转换'x'
为String
实例。该String::String(int)
构造选择,结果是一个临时的实例String('x')
。然后(由于临时变量是一个右值),如果有移动构造函数可用,则该临时变量将被移动构造成mystring
副本,否则将被复制构造。
如果有一个接受2个参数的构造函数,是否可以
=
在这种情况下使用?
是的,您可以使用大括号初始化器来提供多个参数。它将为每个参数搜索最佳的构造函数:
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
相同类型的构造函数,则它将覆盖上面显示的行为:它将改为调用初始化程序列表构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句