[英]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.