簡體   English   中英

返回的返回類型是對象的引用?

[英]What gets returned return type is reference of object?

這就是我所相信的:

當函數返回時,將創建該對象的新臨時副本,並且此temp對象將在調用它的語句期間保留在內存中。

當函數返回引用時,該對象本身將返回。 這意味着該對象不應是本地的。

所以當我這樣做時:

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

在main()中

MyStruct d("notmyname"),g("myname");
d = ReferenceReturn(g);
cout << d.name;
cout << ReferenceReturn(g).name;

兩者都打印垃圾。

退還什么? :引用g的本地副本,即cl,它在函數完成后立即被銷毀;或者引用臨時對象,在語句結束后被銷毀。 但是,如果將創建臨時溫度,它將以正確的方式覆蓋d。 因此,我認為返回的是傳遞值的localcopy的引用。

但是,一旦我在結構中使用析構函數,它就可以完美運行,並提供以下代碼和特定的輸出。

 ~MyStruct()
 {
   cout << name << " is destroying";
  }

輸出:

myname is destroying
myname
myname
myname is destroying
.... 

此輸出顯示為每個調用僅創建一個對象。 (有兩個電話)

但是,為什么沒有析構函數就無法工作?

謝謝

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

創建temporary object ,將其分配給cl ,返回對對象的reference ,銷毀對象。 因此,它dangling reference 編譯器可以使用copy-elision並且不復制對象,但是不能...使用某些東西

 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }
 MyStruct & ReferenceReturn(MyStruct cl) {
    return cl;
 }

在這種情況下結果不確定嗎?

該函數表現出未定義的行為,是的。 問題在於cl是函數中的局部對象,並且您正在返回對其的引用。 這是未定義的行為。 調用者將創建g的副本以傳遞給ReferenceReturn ,並且該副本將在return (可能在調用者使用引用之前)被ReferenceReturn函數銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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