同樣的函式引用裡為什麼使用string引用時會清空資料?

時間 2021-05-30 00:08:36

1樓:朱涵俊

改成print(a)就可以正常顯示,因為a已經分配好了,main函式返回才析構。而「abc」是在引數中的,呼叫的時候先生成乙個string &臨時變數,然後用建構函式初始化,string有個引數是const char *的建構函式。呼叫完成之後,就析構這個臨時變數了,而d引用了乙個已經析構的臨時變數。

至於int型別,實際是一樣的,只不過int析構的時候不會把int值改成0,而string析構的時候把字串設定成空了。

c++引用坑居多,不用引用是更好的選擇。

2樓:Skiiii

感覺沒人答到點子上啊。。。

你傳入的是"abc"

形參型別是const string&

相當於在函式體內部使用"abc"構造了乙個string的臨時物件,並把其繫結在了'L'上

之後函式執行完這個string區域性臨時物件就析構了所以你這個問題就是「返回了區域性物件的引用

如果不在函式內部建立臨時物件,而是在外部建立就沒有任何問題,如下:

3樓:

必須返回物件時,別妄想返回其reference~~~~~Effective cpp 條款21。不要輕易嘗試返回區域性物件的引用,如有必要,請返回右值引用。

4樓:

題主你一定困惑於為什麼int型的引數就能被解引用.雖然堆疊被平棧了.但是,l的位址,是被作為fan'hi.

string型別悲劇就悲劇在,它會呼叫析構函式,也就是最後乙個紅框的內容. 所以那個值直接被抹掉了...o(︶︿︶)o 唉

能懂就懂,不懂也沒關係.這個已經超出了C++語言的範疇.知道有這麼回事情就行了.

5樓:坐下坐下基本操作

我還是比較好奇,你是如何把乙個右值繫結到乙個引用上的?msvc有特殊技巧嗎

----

修正,首先承認錯誤,看題目要看完整再回答,看完整,看完整,看完整。

的確,右值不應該,程式猿也萬萬不能將其被繫結在乙個左值引用上(不管他是const亦或者不是const,但是MSVC裡面竟然可以,吃驚),右值應當被乙個左值先妥妥的存起來(不應該搞起來就直接用,除非是一次性的),然後就可以做任何你想做的事了。【然而這並不是題主的題目】

題主的print函式為const string & print(const string &l) ,當呼叫函式時"abc「,此時"abc"還是乙個右值,然後很據函式匹配原則以及右值當左值用的原則,const string &l 雖然不是最優,但是可以匹配, 好,那就愉快的當左值用了

然而函式用完可是會給你愉快的析構的啊啊啊,也就是說,這個」abc「已經死了,之所以還能列印出來自己的位址,那是"abc"的殘念太深啊啊啊。

總結」abc「菌經歷了傳奇的一生

&& -> (&&& = &) -> 析構 ->return -> 在main中取位址

最後"abc"菌已經出問題了,建議不要繼續使用,待會兒就要燙燙燙燙了

6樓:

const string & d= print("abc");

應該是因為這個傳進去的是個臨時變數,而引數和返回值都是引用傳遞。字串裡面用完了(超出作用域)就被釋放了,所以返回時就返回了乙個空的。返回值去掉引用,可能就能得到"abc"了。

補張圖:

為什麼 C 的庫函式中頻繁使用 typedef?

熊爸爸科技工坊 很簡單,道理有兩個 乙個是取別名,方便移植,比如long型在不同cpu中位數可能不同,早期的64位,現在的128位,將來可能是256位或者1024位,使用typdef把資料型別重新命名後,要移植的時候只要針對CPU把資料型別定義改一下就好了,是不是很方便,這也是老外開發者一直強調的不...

JS為什麼要使用高階函式判斷奇偶?

黑貓 not是乙個通用的函式,作用是把乙個判斷函式 反轉 過來。假設你現在定義了乙個isEven,你想判斷是不是偶數,可以使用 isEven number 這樣可能 對於某些人 稍稍不太直觀。所以上面說到的人可能會再定義乙個isOdd,如果不用not方法,需要這樣 varisOdd function...

C 裡,main函式最後的return為什麼一般加0,加別的會有什麼影響?

嚴格按照標準來的話應該return EXIT SUCCESS EXIT SUCCESS這個巨集在stdlib.h中定義。另,按照21st Century C書中說法,C99以後無需在main函式體末尾顯式地return 0。 Kenneth 傳統的 nix系統中,作為乙個可執行程式的返回值,0表示正...