C 語法 就算不報錯也不要返回臨時物件的引用!

2021-10-05 08:34:21 字數 1575 閱讀 8951

首先 不要返回臨時物件的引用

int

&test()

intmain()

雖然可以編譯通過 並且能夠正確執行 但是如果換成類就不可以了

classaa

(int a):_x

(a)const a&

operator+(

const

int a)

const a&

operator=(

const a& a)

intx()

~a()

//有沒有自定義的析構函式有很大區別

private

:int _x;};

intmain()

執行結果和析構函式有關

~a(

)//d=4;~a

()//d=4;~a

()//d=2;~a

()//d=5;

沒有析構函式時 //d=4;

具體原因的解釋 關於d的值為什麼不一樣 找了半天在

c++返回函式區域性物件的引用裡找到了,看不太懂,但是大概意思是和看有沒有呼叫自帶的析構函式,如果沒有呼叫自己寫的析構函式,就勉強可以用,但是很有風險!!!今天寫乙個類的時候返回了乙個臨時變數的引用就出bug了,調了一下午才清楚。

還有就算困擾很久的操作符過載是怎麼返回的,用的什麼變數。

看了string的模板庫,+操作符返回值不是引用。

_nodiscard _string_const_iterator operator+(

const difference_type _off)

const

好像是返回臨時變數了?不知道怎麼回事,這裡不是重點

=操作符

basic_string&

operator

=(basic_string&& _right)

當進行c=a+b的操作時,a+b返回的是變數,(個人感覺最好=的輸入最好不要用引用),現在string類的+過載時一般都會改變a的大小,還沒發現什麼特別好的解決方法。

貼上一段參考的解釋:在上面的**中,最後能夠輸出正確的值,然而在函式getnode()中,str是乙個區域性的物件,記憶體空間在棧上,當函式退出時,str的記憶體空間被**,這是在高階語言的層面上講的。但是為什麼最後的結果是正確的?原因就是node newnode=getnode();這句呼叫的是預設的拷貝建構函式,如果是自己重新重寫拷貝建構函式,而不用預設的拷貝建構函式,那麼這段**就絕對有問題,最後輸出的是未定義的數。

也就是說直接呼叫預設的拷貝建構函式(或者預設的賦值函式),函式返回,在函式中的區域性變數的銷毀,其實在棧中只是棧頂的指標的移動,仍然還是可以為其賦值的。

對於**,newnode是對getnode函式的引用,當函式結束時,其實是已經吧區域性物件str銷毀了,但是由於輸出的結果仍然還在堆疊中,所以第乙個能夠輸出正確的值,第二個是由於堆疊已經被其他的數覆蓋,所以不能輸出正確的值,而且這個物件也不能為其賦值,因為它的記憶體空間已經不存在了.

語法 C 基本語法

標頭檔案 在程式設計競賽中,我們常見乙個標頭檔案 include 發現它是部分c 中支援的乙個幾乎萬能的標頭檔案,包含所有的可用到的c 庫函式,如 在程式設計競賽中,使用這個標頭檔案是乙個好的想法,特別是當你在選擇標頭檔案時想減少時間,我們更加專注於找到演算法解決問題而不是軟體工程。而從軟體工程的視...

python語法與C語法對比

python屬於弱型別語言,變數直接使用,不需要定義,所以也沒有型別限制,因為一切python變數都是乙個相當於類的存在 但容易在呼叫變數時寫錯名字,且不易debug出來 有利有弊,c語言強型別,就連定義位置都必須安排的明明白白否則編譯不過哈 python為簡化語言的書寫,減少書寫錯誤概率,有很多語...

C 語法總結

1 const 與volatile 的用法 1 const include include 行引數指向const 型別變數的指標 void display c cons int pi 6 new 與delete 運算子 double pd define pointer variable pd new...