这是从一本介绍复制构造函数的教科书中摘录的程序:
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
class point
{
private:
int x,y;
public:
point(int ox =0, int oy =0)
{
cout << " Make object" << this << endl;
cout << " Using default constructor \n";
x = ox, y = oy;
}
point(const point &p)
{
cout << " Make object" << this << endl;
cout << " Using copy constructor \n";
x = p.x, y = p.y;
}
void move(int dx, int dy);
void display();
};
point fct(point a);
int main()
{
point a(5,2);
a.display();
point b = fct (a);
b.display();
getch();
return 0;
}
void point::move(int dx, int dy)
{
x += dx, y += dy;
}
void point::display()
{
cout << "Coordinates :" << x << " " << y << "\n";
}
point fct(point a)
{
point b=a;
//b.move(2,3);
return b;
}
需要注意的是,复制构造函数的形式是:point(const point &p) 而不是point(point &p)(后者是教科书上的,但无法编译,所以我不得不切换到第一个,但我仍然不明白为什么 :( )
课本上说会有3行“Using copy constructor”,对应3次调用copy constructor。我认为这样做的原因是,当你打电话时: b = fct(a)
函数“fct”复制了一个(按值传递),因此一次调用
行:点 b = a:再次调用复制构造函数
然后将返回值复制到 b(main 中的变量,而不是 fct 中的变量)这是第三个。
但是在执行时,只有 2 个调用。谁能给我一个很好的解释?
最佳答案
出现两个拷贝是因为命名返回值优化 (NRVO) 省略了其中一个拷贝。
point fct(point a)
{
point b=a;
return b;
}
point b = fct (a);
第一个拷贝是从main
中的参数a
到fct
中的参数a
。发生这种情况是因为 point
是按值获取的。
第二个拷贝是在func中从a
到b
被省略的拷贝是按值返回b
的拷贝。在这种情况下,b
可以直接分配到调用站点的 b
中,因此不会发生复制。
关于c++ - 复制构造函数调用了 2 次,而不是预期的 3 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31069255/