c 拷貝建構函式引用傳參

2022-07-23 22:45:29 字數 978 閱讀 2864

看一道c++面試題:

給出下述**,分析編譯執行的結果,並提供3個選項: a.編譯錯誤  b.編譯成功,執行時程式崩潰  c.編譯執行正常,輸出10

class a

private:

int value;

public:

a(int n)

a(a other)

void print()

int main()

a a = 10;

a b = a;

b.print();

return 0;

剛開始看到題的時候,我並沒有看出貓膩,說實話,自己在c++這裡還是個菜菜菜菜菜,如果要我選我會十分忐忑的選c,忐忑是因為知道c肯定不是對的,選c是因為自己又太菜看不出貓膩。

ok,正確答案是編譯出錯。

現在來解析一下這裡的考點:拷貝建構函式傳參問題,熟悉c++語法的大佬們都知道在拷貝建構函式a(a other)中有乙個很明顯的錯誤,就是形參,正確的形參應該是 const a& other,而不是 a other。

1.除了常量引用能節省空間外,這兩個形參有什麼區別嗎?

有區別,區別很大。我們都知道將實參傳遞給實參相當於把實參的值賦給形參。執行a b = a;時,會呼叫 b的拷貝建構函式,此時實參 a會被賦值給形參 other,相當於語句 a other = a; 又會繼續呼叫other的拷貝建構函式,將 a賦值給物件other的拷貝建構函式的形參other,如此一來,就會形成乙個遞迴操作而且沒有結束條件,造成堆疊溢位。而c++不會允許這種錯誤發生,因此 a other做形參會編譯錯誤。

而const a& other就不一樣,以引用做形參,並不會呼叫拷貝建構函式,所以正確。

2.為啥要加const

如果在函式中不會改變引用引數物件的值,加不加const無所謂,但是為了程式的安全性著想,加上const會禁止更改引用引數物件。

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

拷貝建構函式是類的六個預設成員函式之一,他是建構函式的乙個過載形式,其引數只有乙個且必須要引用傳遞,那我們不禁想問值傳遞可以嘛?下面是乙個拷貝建構函式的 讓我們來分析下 date const date d intmain 當用已存在的物件建立新物件時候,編譯器會自動呼叫拷貝建構函式完成新物件的初始化...

C 拷貝引用建構函式

class man using namespace std man man age 0 name null 以拷貝的方式初始化函式,指向自己類的乙個引用 man man const man it 對有引數的初始化函式分配記憶體 man man const char s,inti 析構函式 man m...

C 中拷貝建構函式的定義傳參問題

在c 中,我們使用拷貝建構函式來實現物件的複製。我們需要注意的是,在定義拷貝建構函式的時候,傳入引數不能是傳值引數,例如a a other 因為如果是傳值函式,就會在拷貝建構函式內將形參複製為實參,而複製的時候又會呼叫拷貝建構函式,這樣就會造成無休止的遞迴呼叫導致棧溢位,因此c 不允許拷貝建構函式傳...