首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换构造函数或复制构造函数

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

Stack Overflow用户
提问于 2013-08-25 13:54:41
回答 3查看 138关注 0票数 1

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

代码语言:javascript
复制
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行(转换Cont),然后调用第C行(复制构造函数),但是它只称为B行,尽管cls e = 15等同于cls e = cls(15)。因此,我尝试了cls e = cls(15),它也只给出B行。如果有人能解释我们使用以下内容时会发生什么,我会很感激。

cls e = cls(15) //I期待的是一个转换构造函数,然后是复制构造函数,但显然我错了。如能对正在发生的事情作出任何解释,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-25 13:57:22

这是由于复制省略编译器的优化。在某些情况下,编译器可以删除复制构造函数调用。您所看到的是这种优化的实际效果。您正确地假定调用:

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-08-25 13:58:01

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

有关更多细节,请访问这里

基本上,在复制选择中,编译器优化了您的代码,以省略不必要的中间临时对象。

票数 0
EN

Stack Overflow用户

发布于 2013-08-25 13:59:48

你说得对,cls e = 15cls e = cls(15)是一样的。这是因为您的cls(int a)没有被声明为显式。接下来是编译器复制省略优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18429707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档