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

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

為什么C ++編譯器不定義operator ==和operator!=?

為什么C ++編譯器不定義operator ==和operator!=?

C++
紅顏莎娜 2019-12-10 13:08:35
我非常樂于讓編譯器為您完成盡可能多的工作。編寫簡單的類時,編譯器可以為您提供以下“免費”功能:默認(空)構造函數復制構造函數析構函數賦值運算符(operator=)但是它似乎無法為您提供任何比較運算符-例如operator==或operator!=。例如:class foo{public:    std::string str_;    int n_;};foo f1;        // Worksfoo f2(f1);    // Worksfoo f3;f3 = f2;       // Worksif (f3 == f2)  // Fails{ }if (f3 != f2)  // Fails{ }是否有充分的理由呢?為什么進行逐成員比較會是一個問題?顯然,如果該類分配了內存,那么您要格外小心,但是對于一個簡單的類,編譯器肯定可以為您執行此操作嗎?
查看完整描述

3 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

編譯器不會知道您要進行指針比較還是深度(內部)比較。


只執行而不讓程序員自己做是比較安全的。然后他們可以做出所有喜歡的假設。


查看完整回答
反對 回復 2019-12-11
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

如果編譯器可以提供默認的副本構造函數,那么它應該能夠提供類似的默認值的說法operator==()具有一定意義。我認為,決定不提供該運算符生成的編譯器默認值的原因可以由Stroustrup在“ C ++的設計和演變”(第11.4.1節-復制控制)中對默認副本構造函數的說明中得出。 :


我個人認為很遺憾,默認情況下定義了復制操作,并且禁止復制許多類的對象。但是,C ++從C繼承了其默認賦值和復制構造函數,并且它們經常使用。


因此operator==(),問題應該是“為什么C ++具有默認的賦值和復制構造函數?”,而不是“為什么C ++沒有默認的?”,答案是Stroustrup勉強地包含了這些項,以實現與C的向后兼容性。 (可能是大多數C ++疣的原因,但也可能是C ++普及的主要原因)。


出于我自己的目的,在我的IDE中,我用于新類的代碼段包含一個私有賦值運算符和復制構造函數的聲明,因此,當我生成一個新類時,我沒有默認的賦值和復制操作-我必須顯式刪除該聲明private:如果我希望編譯器能夠為我生成這些操作,請參閱本節中的這些操作。



查看完整回答
反對 回復 2019-12-11
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

即使在C ++ 20中,編譯器仍然不會operator==為您隱式生成


struct foo

{

    std::string str;

    int n;

};


assert(foo{"Anton", 1} == foo{"Anton", 1}); // ill-formed

但是您將擁有顯式默認的功能==:


struct foo

{

    std::string str;

    int n;


    // either member form

    bool operator==(foo const&) const = default;

    // ... or friend form

    friend bool operator==(foo const&, foo const&) = default;

};

默認值==是按成員進行的==(與默認副本構造函數按成員進行復制的方式相同)。新規則還提供==和之間的預期關系!=。例如,使用上面的聲明,我可以同時編寫:


assert(foo{"Anton", 1} == foo{"Anton", 1}); // ok!

assert(foo{"Anton", 1} != foo{"Anton", 2}); // ok!

這種特殊的功能(默認operator==和之間的對稱==和!=)來自一個建議,這是更廣泛的語言特點,那就是的一部分operator<=>。



查看完整回答
反對 回復 2019-12-11
  • 3 回答
  • 0 關注
  • 391 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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