转换构造函数或复制构造函数

时间:2013-08-25 13:54:42

标签: c++

我正在尝试了解转换构造函数。我正在使用以下代码

class cls 
{
public:
  cls()
  {
      std::cout << "Regular constructor \n";     ---> Line A
  }
  cls (int a) //Constructing converter
  {
      std::cout << "Int constructor \n";         ---> Line B
  }

  cls (cls& d) //Copy constructor
  {
      std::cout << "Copy constructor \n";        ---> Line C
  }
};


int main()
{
    cls d;
    std::cout << "-----------------------\n";
    cls e = 15; //int constructor then copy constructor
        return;
}

现在我对语句cls e = 15感到困惑,我的理解是这个语句假设调用行B(转换连续)然后调用行C(复制构造函数),但它只调用行B.我虽然{{ 1}}相当于cls e = 15。所以我尝试了cls e = cls(15),它也只提供了B行。如果有人能解释当我们使用以下内容时会发生什么,我将不胜感激

cls e = cls(15) //我期待一个转换构造函数,后跟复制构造函数,但显然我错了。任何有关正在发生的事情的解释都将受到赞赏

3 个答案:

答案 0 :(得分:3)

这是由 copy elision 编译器优化引起的。在某些情况下,允许编译器忽略复制构造函数调用。你看到的是这种优化的实际效果。你正确地打电话给:

  • 转换构造函数,然后是
  • 复制构造函数

但是在这种情况下,构造函数通过使用返回值优化来省略/删除/优化第二个调用。编译器直接将对象构造到e,而不是创建临时对象,然后将其复制到e

如果您使用GCC,可以使用-fno-elide-constructors选项禁用复制省略,您应该会看到预期的结果。

答案 1 :(得分:0)

似乎编译器正在优化您的代码,而不是调用复制构造函数,即copy elision

请查看HERE了解详情。

基本上在复制省略中,编译器会优化您的代码以省略不具有代表性的中间临时对象。

答案 2 :(得分:0)

你是对的cls e = 15cls e = cls(15)相同。这是因为您的cls(int a)未声明。接下来只是编译器复制省略优化。