c++ 调用了两次拷贝构造函数的问题

天王盖地虎626 发布于 09/25 07:44
阅读 146
收藏 0

看下下面的代码,其运行结果让我不能理解,网上说法,是调用了两次拷贝构造函数,可是,我不理解,麻烦朋友帮忙分析一下,为什么打印出两次copy,为什么标红的代码会执行两次? 谢谢。

#include <iostream>
using namespace std;

class A {
public:
  A(int a) {
    cout << "constructor" << endl;
    this->num = new int(a);
  }
  A(const A& t) {
    cout << "copy" << endl;
    this->num = new int(*(t.num));
  }

  int* num;
};

A get_A() {
  A a(10);
  return a;
}

int main() {
  A test = get_A();
}
输出结果为:

constructor
copy
copy

加载中
1
老汉-憨憨
老汉-憨憨

return 一次,   =  一次,所以两次

0
b
bobby2006

linux下,只有一次 constructor 啊

0
tcxu
tcxu

请楼主说明你的编译运行环境。我这里,在 Dev-C++ 5.4.0 下,只输出一次 constructor。

若要调用拷贝构造函数, 写成如下代码:

...
A get_A() {
  A a(10);
  A b = a;
  return a;
}

int main() {
  A test = get_A();
}

结果,也只输出一次 copy:

constructor
copy

 

0
猴子叫你一声敢答应吗
猴子叫你一声敢答应吗

楼主你在发这些问题时说明下编译器的厂商和版本。这样不好分析。

0
gxhblues
gxhblues

如果是90年代的编译器,那就是1楼的答案。

现代C++编译器已经强制实现RVO,你这个例子对于一个合格的现代编译器来说就一次初始的构造调用,后面两次都优化掉了。

返回顶部
顶部