簡體   English   中英

從C ++中的函數返回對象

[英]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對象:一個在main函數中,一個在operator+函數中。 operator+函數中的Box對象被復制main函數中的對象中。 然后, operator+函數中的對象將被破壞,而main函數中將保留該對象。

現代的優化編譯器做跳過上述一些步驟中提到,最顯着的這只會造成一個對象作為其組成部分的返回值優化 (只創建一個單一的對象,而不是復制任何東西被稱為復制省略 ,這個詞你會在使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM