C 函式返回型別是引用的問題,C 函式返回值為引用型別時出錯!大神進!

2021-09-12 00:09:54 字數 2740 閱讀 7830

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 函式返回引用問題

include using namespace std int a int index int i 這裡需要申明一下 否則main不能呼叫index函式 int main index 2 25 cout 返回引用 1 主函式main的返回值 這裡提及一點,返回0表示程式執行成功。2 返回非引用型別 ...

c函式返回值為引用型別時出錯大神進

我不是大神,但我大概知道你是怎麼回事。你的引數是const string 型別,首先你要知道string 前為什麼要加const.還有你要知道const物件和非const物件的區別在 物件前加const,則只能呼叫該物件的const方法,換句話說,不能對其進行任何內容上的修改。而傳 是因為要避免複製...

scanf函式c的問題,c語言scanf函式格式問題

首先scanf應該這樣用 scanf 格式化字串 變數地址 你的用法是錯誤的 c 只從輸入緩衝裡讀一個字元,但是你在輸入的時候不只一個字元,剩下的字元 包括回車 就留給第二個 c 了 解決方法 printf y or n?scanf c n a fflush stdin printf y or n?...