第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

C++
寶慕林4294392 2019-10-24 11:16:20
我非常樂于讓編譯器為您完成盡可能多的工作。編寫簡單的類時(shí),編譯器可以為您提供以下“免費(fèi)”功能:默認(rèn)(空)構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)析構(gòu)函數(shù)賦值運(yùn)算符(operator=)但是它似乎無法為您提供任何比較運(yùn)算符-例如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{ }是否有充分的理由呢?為什么進(jìn)行逐成員比較會(huì)是一個(gè)問題?顯然,如果該類分配了內(nèi)存,那么您要格外小心,但是對(duì)于一個(gè)簡單的類,編譯器肯定可以為您執(zhí)行此操作嗎?
查看完整描述

3 回答

?
慕森卡

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊

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


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


查看完整回答
反對(duì) 回復(fù) 2019-10-24
?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

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


我個(gè)人認(rèn)為很遺憾,默認(rèn)情況下定義了復(fù)制操作,并且禁止復(fù)制許多類的對(duì)象。但是,C ++從C繼承了其默認(rèn)賦值和復(fù)制構(gòu)造函數(shù),并且它們經(jīng)常使用。


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


出于我自己的目的,在我的IDE中,我用于新類的代碼段包含一個(gè)私有賦值運(yùn)算符和復(fù)制構(gòu)造函數(shù)的聲明,因此,當(dāng)我生成一個(gè)新類時(shí),我沒有默認(rèn)的賦值和復(fù)制操作-我必須顯式刪除該聲明private:如果我希望編譯器能夠?yàn)槲疑蛇@些操作,請(qǐng)參閱本節(jié)中的這些操作。


查看完整回答
反對(duì) 回復(fù) 2019-10-24
?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊

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


struct foo

{

    std::string str;

    int n;

};


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

但是您將擁有顯式默認(rèn)的功能==:


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;

};

默認(rèn)值==是按成員進(jìn)行的==(與默認(rèn)副本構(gòu)造函數(shù)按成員進(jìn)行復(fù)制的方式相同)。新規(guī)則還提供==和之間的預(yù)期關(guān)系!=。例如,使用上面的聲明,我可以同時(shí)編寫:


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

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

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


查看完整回答
反對(duì) 回復(fù) 2019-10-24
  • 3 回答
  • 0 關(guān)注
  • 777 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)