【发布时间】:2017-11-23 07:40:31
【问题描述】:
这是一个在互联网上找到的朋友功能示例:
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle() {}
Rectangle(const Rectangle &r) {
width = r.width;
height = r.height;
cout << "copy\n";
}
Rectangle (int x, int y) : width(x), height(y) {}
int area() {return width * height;}
friend Rectangle duplicate (const Rectangle&);
};
Rectangle duplicate (const Rectangle& param)
{
Rectangle res;
res.width = param.width*2;
res.height = param.height*2;
return res;
}
int main () {
Rectangle foo;
Rectangle bar (2,3);
foo = duplicate (bar);
cout << foo.area() << '\n';
return 0;
}
输出:
24
请注意,友元“duplicate”函数创建了一个局部变量并作为返回值返回给调用者。这不应该是一个局部变量并且分配在这个堆栈上吗?一旦“重复”完成执行,它不应该被销毁吗?这个例子好吗?
谢谢。
【问题讨论】:
-
返回变量会复制它。
-
从概念上讲,局部变量
res是在栈上构造的,然后移入返回值,然后运行局部变量的析构函数。在实践中,编译器会优化这一点 -
这不起作用的唯一情况是如果您尝试返回一个数组,因为当您返回数组时,数组会衰减为指针,并且指针指向一个被破坏的对象。
-
@DeanSeo 但它在概念上是一个副本,这是一种优化。
-
@Swift
Rectangle有一个自动生成的移动构造函数
标签: c++