糟糕的概念 - 获得意想不到的结果

时间:2017-07-21 08:22:13

标签: c++ oop constructor copy-constructor

#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;
}

上述程序的输出是 - &gt; 创建

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

据我说,输出应该是 - &gt; 创建创建

2 个答案:

答案 0 :(得分:1)

main()

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

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

fun()内部,未明确初始化局部变量t,因此调用默认构造函数(打印第二个创建

答案 1 :(得分:0)

我不希望创建创建,而是创建创建副本(没有复制省略)。

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

使用和不带-fno-elide-constructors选项的Compiler Explorer可以看到这一点。