1樓:匿名使用者
引用就是變數的別名,返回c3的引用,返回的就是c3 ,c3被清除,再呼叫c3的函式,結果當然不正確;
如果返回 i 後,i被清除,但是返回值已經被輸出了,結果是正確的;
返回c型別,g函式返回 的是c型別的一個物件,雖然c3被清除,但是返回的物件還能呼叫get函式
你可以在c類中增加一個解構函式,除錯執行,你會發現,g函式裡執行了一次解構函式,然後get函式後又發生了一次析構
慢慢理解吧,很難講清楚啊
2樓:匿名使用者
g()返回的是c3.但是在g()函式結束的時候c3的生命也結束了被自動釋放.最後的結果可能是0xcccccccc,0xcdcdcdcd等.
反正就是不合法的值.debug不會release會崩潰.
3樓:行走的標本
其實一樓已經說明了樓主的問題了
整個程式的流程是這樣的 宣告類c 宣告返回值為類引用的函式g()樓主希望的引用是類似於返回為c3的引用
但是 物件c3的宣告是在函式g()內 也就意味著 當return c3執行後 物件c3的儲存空間就已經沒有了 指向一個隨機位置 這樣讀取的值也是未知的
你可以嘗試將物件c3在函式外面申請 這樣 即使函式執行return以後 返回的物件依然存在 引用的位置也是有效的 輸出結果就是正確的了
主要是對一個生存週期的把握還不到位,多看看關於試用引用的要點就會理解錯誤出在**了
c++函式返回值為引用型別時出錯!大神進!
4樓:匿名使用者
我不是大神,但我大概知道你是怎麼回事。
你的引數是const string&型別,首先你要知道string&前為什麼要加const. 還有你要知道const物件和非const物件的區別在**。
物件前加const, 則只能呼叫該物件的const方法,換句話說,不能對其進行任何內容上的修改。而傳&是因為要避免複製構造,所以引數為const string&.
那麼再來說說你的函式體內的這行**,首先word+ending將產生一個臨時物件,因為呼叫了string內部的string operator(const string& lhs, const string& rhs)函式。基於此,你的函式就不能返回引用。因為函式體內的臨時物件在函式出棧之後會被銷燬。
所以除非你取消+號,只返回某個引數。不然就不能返回引用!
接下來說說你的const問題。因為你的引數是const的,但是你返回的時候卻把const給取消了,返回了string&. 這是絕對不允許的。
你可以想象,const物件是對普通物件的一種限制,那麼由普通物件變成const物件,這種是允許的,因為限制沒有被放大。但是反過來,由一個const物件變成普通物件,你試圖放大這種限制就不被允許了。除非你使用c++提供的const_cast轉換!
5樓:匿名使用者
const string 不能繫結為string 引用,編譯器已經說的很明白了
c++中返回引用和返回值的區別
6樓:
通常的返回機制將返回值複製到臨時儲存區域中, 隨後呼叫程式將訪問該區域.
返回引用則程式則呼叫程式將直接訪問返回值.
通常引用將指向傳遞給函式的引用, 因此呼叫函式實際上是直接訪問自己的一個變數.
比如const int& fun (int& a, const int& b)
int x = 1, y = 2, z;
z = fun(x, y);
//等價於 fun(x, y); z = x;
而且返回引用不能返回函式內部的臨時變數, 因為該變數隨著函式的結束而銷燬, 返回值會毫無意義, 如
const int& fun (int& a, const int& b)
//該程式會崩潰, 因為變數c隨著程式的結束而銷燬, 繼而返回的c的同名物件毫無意義
7樓:嚴棠偉雨筠
如果返回值,那麼記憶體中只有兩個儲存該整形資料的單元,一個是函式中生成的被返回的整形資料,一個是接收以後的整形資料,而返回引用則只要一格單元來儲存這個整形資料,被返回的和接收到的都是同一個整形資料。
c++ 引用返回值 與 返回指標
8樓:匿名使用者
int * d = &c;
也就是*d就等效於c了啊
也就是return *d;
就等效於
return c;
9樓:匿名使用者
*d是指標d指向的資料,你的寫法中,指標d指向了引用c的位置,其實也就是傳入實參a的地址空間上的資料,故而是一直存在且可以正確返回的。如果你在k()函式內部不是使用傳輸的c(也就是換個變數名,什麼都行),那自然就不可以了,出了這個函式就被釋放了
10樓:匿名使用者
return *d;你返回的是指標d指向的值,並不是返回的指標...return d;才是返回的指標 int*...而你h函式返回值型別是int& 也相當於int 這時候編譯的話c++應該會報錯,因為c++編譯器檢查型別很嚴格 c編譯器裡面雖然沒有引用,int* 返回成int 可能會報警告,因為指標儲存的地址也是一個數..
有的會報錯...
區域性變數是不能返回成引用的...引用的實質相當於給變數弄了個別名,然後通過別名去找這個變數...而區域性變數的記憶體空間在函式結束後就被**了,也就是這個變數不存在了,那麼它的別名還有什麼意義....
C 中返回引用和返回值的區別,C 引用返回值 與 返回指標
通常的返回機制將返回值複製到臨時儲存區域中,隨後呼叫程式將訪問該區域.返回引用則程式則呼叫程式將直接訪問返回值.通常引用將指向傳遞給函式的引用,因此呼叫函式實際上是直接訪問自己的一個變數.比如const int fun int a,const int b int x 1,y 2,z z fun x,...
關於c語言函式型別定義問題,關於C語言函式型別定義問題
超級福醬 這個語句主要是用的c語言的等號算符 c語言裡面等號可以看做一個函式,它的返回值是右值。比如int i,j,x i j 5 這條語句除了賦值以外還有返回值,返回值是5所以可以這麼寫 x i j 5 這裡x就等於5了。所以 語句 if x 0 就可以簡寫為 if i j 5 0 另外,c裡面字...
c語言自定義函式返回陣列的問題,C語言自定義函式返回一個陣列的問題
雙槍老椰子 方法1 利用全域性變數 分析 全域性變數作為c語言的一個知識點,雖然我們都瞭解它的特點,但在實際教學過程中應用得並不是很多。由於全域性變數的作用域是從定義變數開始直到程式結束,而對於編寫有多個返回值的c語言函式,我們可以考慮把要返回的多個值定義成全域性變數。當函式被呼叫時,全域性變數被更...