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

2021-09-19 08:49:04 字數 788 閱讀 5016

首先我們了解複製建構函式起作用的三種情況:

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 func()

int main()

輸出結果: copy constructor called

4 ok,理解上面的複製建構函式起作用的情況之後我們考慮第二種情況   func(a2);    。

在作為函式引數是,為什麼也會呼叫複製建構函式?原因是實際上將a2作為實參傳遞給了形參 a a1,即a a1=a2 ,和第一種情況一致故呼叫了複製建構函式。

既然如此,重點來了。假如複製構造函式引數不是引用型別的話,即我們的複製建構函式寫為 a (a a)  , 那麼將使得

a  a2(a1 ) 變成a1作為實參傳值給 a  a2(a a ),即形參 a  a  = a1,因為複製建構函式的形參 a 沒有被初始化, 所以a  a  = a1繼續呼叫複製建構函式,接下來的是構造a,也就是 a.a(a1),必然又會有a1傳給a(a   a), 即 a   a=a1;那麼又會觸發複製建構函式,如此將永遠的遞迴下去。

說明拷貝建構函式的引數使用引用型別,是避免拷貝建構函式無限制的遞迴下去。

什麼是複製建構函式

複製建構函式又稱為拷貝建構函式,是一種特殊的建構函式,它由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。它存在唯一乙個引數是不可變的。這個函式經常在函式呼叫期間於使用者定義型別的值傳遞及返回。拷貝建構函式要呼叫基類的拷貝建構函式和成員函式。一般它使用常量方式呼叫,另外,它也可以用非常量方式...

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

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

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

第乙個輸出 constructor with argument.cexample aaa 2 這裡建立了變數aaa,在建立的同時還帶有引數2,那就呼叫帶引數的建構函式 第二個輸出 constructor with argument.cexample bbb 3 分析同第乙個 第三個輸出 assign...