1.先總結c++對傳參和傳返回值時構造的優化處理。
1)在c++中,傳參和傳返回值時,如果是引用型別,則不用呼叫拷貝建構函式,直接返回別名。 當語句為乙個表示式時,編譯器會選擇優化,將建構函式與拷貝構造合併。 在c++中,呼叫幾次建構函式和拷貝建構函式,就會相應的呼叫幾次析構函式。
2)系統在什麼情況下會進行優化呢?
1>當拷貝構造存在連續的賦值情況的時候,
2>當多個臨時物件連續賦值的時候
簡單點來說就是,在一次拷貝構造結束後,並沒有直接返回給要建立的物件而是又再次進行了拷貝構造。或者是,建立乙個臨時物件,來進行拷貝構造,然後又返回了乙個臨時物件,再用這個返回的臨時物件繼續拷貝構造。這時候,系統就會自動優化。
例如:
2.再完成下面的題目。
test1中呼叫了2_次aa的拷貝建構函式,_1次aa的賦值運算子函式的過載。
test2中呼叫了_2次aa的拷貝建構函式,_0次aa的賦值運算子函式的過載。
test3中呼叫了3_次aa的拷貝建構函式,_0次aa的賦值運算子函式的過載。
class
aa {};
aa f (aa
a)
void test1
()
//test1中,定義aa時呼叫了一次建構函式,a1傳給f(),傳參時呼叫了1次拷貝構造;返回臨時變數a時呼叫了1次拷貝構造,接著呼叫了1次賦值運算子的過載。
void test2
()
//test2中,生成物件a1時呼叫了一次建構函式,a1傳參給f()時,呼叫了1次拷貝構造,返回臨時變數a時呼叫了1次拷貝構造,接著將臨時變數a直接賦值給a2.
void test3
()
//test3中,生成物件a1時呼叫了一次建構函式,a1傳參給f()時,呼叫了1次拷貝構造,再返回臨時變數a時呼叫了1次拷貝構造,將返回的臨時變數作為再次呼叫f()時的引數,再返回臨時變數a時呼叫了1次拷貝構造,接著用臨時變數a初始化a2.
討論構造 拷貝構造的N種呼叫情況
1.先總結c 對傳參和傳返回值時構造的優化處理。總結 在c 中,傳參和傳返回值如果是引用型別,則不用呼叫拷貝建構函式。當語句為乙個表示式時,編譯器會自動優化。一般而言,呼叫幾次構造和拷貝構造,就會呼叫幾次析構函式。系統在什麼情況下會進行優化呢?當拷貝構造存在連續的賦值情況時,當多個臨時物件連續賦值。...
討論構造拷貝構造的N中呼叫情況的問題
1.c 形式引數型別和返回值型別如果是引用,那麼在傳遞時,會把實參或者返回值的引用自動賦值給形式引數。2.c 返回值賦值和返回值的使用往往會進行編譯器的優化.例如下面的呼叫中,只會呼叫兩次建構函式 一次預設建構函式,一次自動拷貝建構函式 注 只有在乙個表示式內才會優化 test1中呼叫了 2 次aa...
構造和拷貝構造的N種呼叫情況的問題
1.先總結c 對傳參和傳返回值時構造的優化處理。總結 在c 中,傳參和傳返回值時,如果是引用型別,則不用呼叫拷貝建構函式,直接返回別名。當語句為乙個表示式時,編譯器會選擇優化,將建構函式與拷貝構造合併。在c 中,呼叫幾次建構函式和拷貝建構函式,就會相應的呼叫幾次析構函式。只有當乙個物件已經存在時,d...