看一道c++面試題:
給出下述**,分析編譯執行的結果,並提供3個選項: a.編譯錯誤 b.編譯成功,執行時程式崩潰 c.編譯執行正常,輸出10剛開始看到題的時候,我並沒有看出貓膩,說實話,自己在c++這裡還是個菜菜菜菜菜,如果要我選我會十分忐忑的選c,忐忑是因為知道c肯定不是對的,選c是因為自己又太菜看不出貓膩。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;
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 不允許拷貝建構函式傳...