為什麼拷貝建構函式使用的是引用傳遞而不是值傳遞?

2021-09-25 03:13:51 字數 635 閱讀 6283

簡單來說,如果使用值傳遞,會出現乙個無限迴圈,並最終出現錯誤。

舉個例子:乙個類為temp,假設拷貝建構函式為值傳遞:

temp (

const temp c)

temp a;

//生成了乙個temp類的物件

temp b = a;

//將會呼叫拷貝建構函式

此時,b需要呼叫其拷貝建構函式,需要將a進行值傳遞進入b的拷貝建構函式,而在進行值傳遞時,b的拷貝建構函式會生成乙個該類的臨時物件(假設為c),會執行temp c=a(初始化形參,也就是初始化函式的區域性變數),這又將呼叫c的拷貝建構函式,將a以值傳遞的方式傳入…如此往復,每一次都會產生新的物件,從而耗盡資源,產生錯誤。

而引用傳遞為什麼不會有這個問題呢?

假設拷貝建構函式為:

temp (

const temp &c)

temp a;

temp b = a;

此時,當上述b呼叫拷貝建構函式時,會生成乙個臨時的引用變數,而不是物件,會執行temp &c=a(同樣是初始化形參,只不過是初始化乙個引用),這不會產生新的物件,也就不會呼叫拷貝建構函式,只是增加了乙個指向a的臨時引用而已。

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

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

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

1 include2 include 3using namespace std 4class foo5 13 foo foo f ss f.ss 1417 foo operator const foo f1 1822 void test foo f2 2326 27 28int main 29 如果...

拷貝建構函式為什麼要用引用?

一 引用 1.概念 引用不是新定義乙個變數,而是給已經存在的變數取了個別名,編譯器不會為引用開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。2.和指標區別 引用在定義時必須初始化,指標沒有要求 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體 沒有...