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表示正...