拷貝建構函式的型別為什麼必須使用引用型別

2021-07-10 10:50:15 字數 1162 閱讀 7271

有的看著理所當然的東西往往被我們忽略其深層的意義,就像c++ 拷貝建構函式的引數為什麼必須是引用型別呢,許多初學者都會說,「為了減少一次記憶體複製唄!」(其實剛開始我也是這樣想的),但究竟是不是這樣呢?來,看個小例子(你一定會說:昂....原來是這樣啊!);

#includeusing namespace std;

class myexample

{ int mtest;

public:

myexample(int x):mtest(x){ //帶引數的建構函式

cout << "我是建構函式!"《看結果:

我是建構函式! //myexample a(2);

我是建構函式! //myexample b(3);

賦值運算子過載 //b=a;

我是拷貝建構函式! //myexample c=a;

我是拷貝建構函式!

如果你想的結果和上面的一樣,恭喜你,你不用往下看了.

我們來分析一下: 

第乙個輸出和第二個輸出:呼叫建構函式,就不用解釋了吧!

第三個和第四個為什麼不一樣呢?大家仔細看,b已經被例項化了,不需要構造,在這裡,只是把a的值賦給它,只會呼叫賦值函式,而第四個c還沒有被例項化,因此呼叫拷貝建構函式,構造處c,而不是賦值,

第五個實際上是把a作為引數傳遞給mytestfun(myexample ex),就相當於myexample ex=a;所以呼叫拷貝建構函式.  

通過這個例子,我們來分析一下,拷貝建構函式為什麼必須用引用型別,myexanple c=a;當我們不用引用作為拷貝建構函式的形參時,使得a通過值傳遞傳遞給c,因為要構造物件, 又會呼叫拷貝建構函式,就這樣一直遞迴呼叫遞迴下去了.

所以繞了那麼大的彎子,就是想說明拷貝建構函式的引數使用引用型別不是為了減少一次記憶體拷貝, 而是避免拷貝建構函式無限制的遞迴下去。

如果形參是指標型別的,從編譯的角度看:

程式在編譯時分別將指標和引用新增到符號表上, 符號表上記錄的是變數名及變數所對應的位址,指標在符號表上對應的位址是指標變數的位址值,指標變數中存的才是對應指向物件的位址值,而引用在符號上對應的位址值為引用的對應的位址值.在這裡, 指標就像中介,我們租房子跟主家談和跟中介談,哪個划算,大家應該清楚吧!

拷貝建構函式的型別為什麼必須使用引用型別

有的看著理所當然的東西往往被我們忽略其深層的意義,就像c 拷貝建構函式的引數為什麼必須是引用型別呢,許多初學者都會說,為了減少一次記憶體複製唄 其實剛開始我也是這樣想的 但究竟是不是這樣呢?來,看個小例子 你一定會說 昂.原來是這樣啊 include using namespace std clas...

拷貝建構函式的引數為什麼必須使用引用型別

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

拷貝建構函式的引數為什麼必須使用引用型別

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