為什麼複製建構函式的引數需要加const和引用

2021-08-19 18:58:19 字數 1362 閱讀 4085

第乙個輸出: constructor with argument.     //cexample aaa(2);

這裡建立了變數aaa,在建立的同時還帶有引數2,那就呼叫帶引數的建構函式

第二個輸出:constructor with argument.     //cexample bbb(3);

分析同第乙個

第三個輸出:assignment operator.                //bbb = aaa;

bbb之前已經建立了,所以這個不會呼叫建構函式,而只是將aaa賦值給bbb,所以呼叫賦值函式

第四個輸出:copy constructor.                      //cexample ccc = aaa;

這個和上乙個的區別就在於:bbb之前已經建立過了,而這裡的ccc是在這條語句才建立的,所以這裡是在建立ccc的同時將aaa賦值給ccc,所以這句呼叫的肯定是建構函式,又因為需要將aaa賦值給ccc,所以呼叫的是拷貝建構函式。

第五個輸出:copy constructor.                     //  bbb.mytestfunc(aaa);

這裡是呼叫了乙個自己寫的mytestfunc函式,其中這個函式中的引數沒有採用引用,那就是值傳遞的方式。就是編譯器先建立乙個型別為cexample名稱為ex的物件,然後將aaa的值傳遞給ex(值傳遞方式的特性),將相當於要執行一條cexample ex = aaa的語句。經第四個輸出的分析可知,這需要呼叫拷貝建構函式。所以輸出copy constrctor。

【錯誤答案】個人第一反應:為了減少一次記憶體拷貝。

【正確答案】由上節的第五個輸出分析可知,在執行bbb.mytestfunc(aaa);時,其實會呼叫拷貝建構函式。如果我們的拷貝建構函式的引數不是引用,那麼在bbb.mytestfunc(aaa);時,呼叫cexample ex = aaa;,又因為ex之前沒有被建立,所以又需要呼叫拷貝建構函式,故而又執行cexample ex = aaa;,就這樣永遠的遞迴呼叫下去了。

所以, 拷貝建構函式是必須要帶引用型別的引數的, 而且這也是編譯器強制性要求的。

【正確答案】如果在函式中不會改變引用型別引數的值,加不加const的效果是一樣的。而且不加const,編譯器也不會報錯。但是為了整個程式的安全,還是加上const,防止對引用型別引數值的意外修改。

——如有不對的地方,非常歡迎給予指導!

——【感謝】資料**於

——【感謝】資料**於

為什麼需要複製建構函式?

複製建構函式由編譯器隱式呼叫,主要的用途是 1 根據另乙個同型別的物件現實或隱式初始化乙個物件 2 複製乙個物件,將它作為實參傳給乙個函式 3 從函式返回時複製乙個物件 4 初始化順序容器中的元素 5 根據元素初始化式列表初始化陣列元素 類型別物件的初始化 直接初始化和複製初始化 根據c prime...

複製建構函式的引數為什麼只能是引用型別

首先我們了解複製建構函式起作用的三種情況 a a2 a1 a a2 a1 初始化語句,非賦值語句 class a a a a int main a a2 func a2 return 0 程式輸出結果為 copy constructor called class a a const a a a fu...

拷貝建構函式的引數為什麼是引用

在c 中,建構函式,拷貝建構函式,析構函式和賦值函式 賦值運算子過載 是最基本不過的需要掌握的知識。但是如果我問你 拷貝建構函式的引數為什麼必須使用引用型別?這個問題,你會怎麼回答?或許你會回答為了減少一次記憶體拷貝?很慚愧的是,我的第一感覺也是這麼回答。不好還好,我有理性這個好品質。思索一下以後,...