对一个参数构造函数使用explicit关键字

时间:2014-10-19 01:29:07

标签: c++ class object constructor explicit

我发现了很久以前回答的另一个问题,并没有真正理解其中一个答案。 Eddie's answer,在他的回答中他说如果您使用String mystring = 'x';,那么x将转换为int并致电String(int)。为什么这个语句会调用构造函数?我认为为了使用构造函数,你必须使用像String mystring('x')这样的语句。赋值运算符=是否等同于创建对象的新实例?

1 个答案:

答案 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,那么它将覆盖上面显示的行为:它将调用初始化列表构造函数。