亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教兩道C++拷貝構造函數vs重載賦值操作符=的面試題

請教兩道C++拷貝構造函數vs重載賦值操作符=的面試題

SMILET 2018-07-31 15:21:13
首先請教一下概念:比如現在定義了一個class叫Example,然后main()函數里先聲明了Example A; 再Example B=A或者Example B(A)。這里,“Example B=A”自然屬于重載賦值操作符=,那么“Example B(A)”是否也屬于重載賦值操作符=呢?看到網上有句話叫“當需要拷貝構造函數時,重載賦值操作符也是需要的;反之亦然?!薄@個說法是否正確呢?面試題1:class Sc    {    public:        int x;    public:        Sc(int xx): x(xx) {}        Sc(const Sc&a) {x=a.x; x++;}        void operator = (const Sc &a1) {x=a1.x; x--;}    };int main()    {    Sc a(4);    Sc b=a;    cout << b.x << endl;    return 0;    }請問運行之后為什么b.x是5呢?面試題2:class String    {    public:        explicit String(char ch, int n=1) {}        String(const char *p) {}    private:        void operator = (const char*) {}    };int main()    {    String x="aaa";    return 0;    }面試官問:“這段程序顯然有問題。那么問題出在哪里呢?explicit,還是constructor,還是operator=呢?”懇請指點。謝謝大家!
查看完整描述

2 回答

?
寶慕林4294392

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 會出現一次賦值的這種實現。

面試題一:

同樣的問題,你理解了上面的就理解了,這道題

面試題二:

應為賦值重載被干掉了,所以可能不兼容上述的多一次賦值的那種編譯器實現?

感覺你的這個題目可能有點年代。所以你是在面試哪一家。。


查看完整回答
反對 回復 2018-08-06
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

  1. Example B(A) 是調用拷貝構造函數.

  2. Sc b=a; 調用拷貝構造函數, 所以 b.x 初始化為4, 在, x++ 得到 5.

  3. 沒有問題, 會使用默認合成的拷貝構造函數String x="aaa";執行拷貝初始化, 而且拷貝構造函數的參數是const String &. 所以會根據構造函數String(const char *p) {}轉換為對應的String對象,在進行拷貝初始化.
    你可以這樣測試:

String(const char *p) { 
    std::cout << "run String(const char *p)" << std::endl; 
}


查看完整回答
反對 回復 2018-08-06
  • 2 回答
  • 0 關注
  • 1201 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號