2 回答

TA貢獻2021條經驗 獲得超8個贊
“Example B=A”自然屬于重載賦值操作符=,那么“Example B(A)”是否也屬于重載賦值操作符=呢?
這里 Example B = A 不是重載賦值,而是隱含的調用了 Example(Example& ) 這個構造函數,如果用戶沒有定義 就是用合成的函數 bitcopy過去的。同理 Example B(A);
對于這個比較現代的編譯器應該都是這么實現的。如果你單獨寫
Example B;
這是一個聲明,但是如果有可用的構造函數(包括是編譯器合成的) 那么會自動調用初始化。認為 Example B = A;就存在一次賦值,大概是 Example B = A; 早期會被解釋成
Example B;
B = A;
但是從現代編譯器的實現上是不正確的,現代編譯器沒那么傻。
當需要拷貝構造函數時,重載賦值操作符也是需要的;反之亦然.
可否說明出處。Example(Example& )就是拷貝構造函數,這句話的意思是為了兼容上面不同的編譯器實現?也就是Example B = A 會出現一次賦值的這種實現。
面試題一:
同樣的問題,你理解了上面的就理解了,這道題
面試題二:
應為賦值重載被干掉了,所以可能不兼容上述的多一次賦值的那種編譯器實現?
感覺你的這個題目可能有點年代。所以你是在面試哪一家。。

TA貢獻1841條經驗 獲得超3個贊
Example B(A) 是調用拷貝構造函數.
Sc b=a;
調用拷貝構造函數, 所以b.x
初始化為4, 在,x++
得到 5.沒有問題, 會使用默認合成的拷貝構造函數.
String x="aaa";
執行拷貝初始化, 而且拷貝構造函數的參數是const String &
. 所以會根據構造函數String(const char *p) {}
轉換為對應的String
對象,在進行拷貝初始化.
你可以這樣測試:
String(const char *p) { std::cout << "run String(const char *p)" << std::endl; }
添加回答
舉報