【问题标题】:Oops concept - getting unexpected result哎呀概念-得到意想不到的结果
【发布时间】:2023-04-08 21:34:01
【问题描述】:
#include<iostream>
using namespace std;

class Test
{
   /* Class data members */
public:
   Test(const Test &t) { /* Copy data members from t*/ cout<<"copy\n";}
   Test()        { /* Initialize data members */ cout<<"create ";}
};

Test fun()
{
    Test t;
    return t;
}

int main()
{
    Test t1;
    Test t2 = fun();
    return 0;
}

上述程序的输出是-> create create

为什么构造函数只被调用了两次?

根据我的说法,输出应该是 -> create create create

【问题讨论】:

  • RVO
  • 除了上面的评论,你可能还想看看copy elision
  • @BiagioFesta 谢谢

标签: c++ oop constructor copy-constructor


【解决方案1】:

在你的main()

t1 未显式初始化,因此它使用默认构造函数(打印一个 create

t2fun() 的返回值显式初始化,语句的Test t2 部分只是变量的声明。

fun() 内部,局部变量t 未显式初始化,因此调用了默认构造函数(打印第二个create

【讨论】:

    【解决方案2】:

    我不希望create create create,而是create create copy copy(没有复制省略)。

    • 第一个创建是t1 in main()
    • 第二次创建是t in fun()
    • 第一个副本是t被复制到fun()的返回。
    • 第二个副本是fun()的返回值被复制到main中的t2

    您可以通过 Compiler Explorer 看到这一点,无论是否使用 -fno-elide-constructors 选项。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多