[英]Returning an object from a function in C++
我有一个小程序,其中有一个全局函数使运算符+
重载:
class Box {
public:
Box (int, int);
Box (const Box&);
~Box ();
int get_width() const;
int get_length() const;
private:
int width;
int length;
};
Box operator+(const Box& a, const Box& b) {
int w, l;
w = a.get_width() + b.get_width();
l = a.get_length() + b.get_length();
return Box(w, l);
}
在operation+
函数中,我返回了Box
类的对象,因为该对象未通过操作符new
实例化,所以该对象分配在堆栈上,不是吗?
int main (int argc, char *argv[]) {
Box a(100, 200);
Box b(101, 202);
Box c = a + b;
cout << "width: " << c.get_width() << "; length: " << c.get_length() << endl;
return 0;
}
在我的main
功能中,我尝试添加2个框a + b
,并打印框c
的大小。 事实证明,对象c
已持久存在,这意味着在执行功能operator+
之后并未将其从堆栈中移除。 或者,对象c
实际上分配在堆中?
我很困惑,有人可以向我解释一下吗?
关于您的代码。 如果您具有以下功能
Box foo() {
auto box_one = Box{};
auto box_two = Box{};
return box_one + box_two;
}
int main() {
auto box = foo();
// use box
}
此foo()
函数中的局部变量在函数的堆栈中启动(有关更多信息,请参见下面的最后一段),然后将其复制(再次参见下文)到位于main()
的堆栈中的变量box
main()
box
变量的生存期与周围的范围有关,在这种情况下,它是main()
的持续时间。 对象在栈中分配给函数main()
,该函数位于对象所在的位置。
在大多数优化的编译器(C ++ 17之前的版本)和C ++ 17之后的所有符合标准的编译器中,将从foo()
函数返回的原始Box
变量直接放置在被调用方堆栈中应有的位置,因此foo()
的返回对象从一开始就位于main()
堆栈中(假设从main()
调用了它)此过程称为省略
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.