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

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

默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)的“ = default”與“ {}”有何不同?

默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)的“ = default”與“ {}”有何不同?

C++
慕運(yùn)維8079593 2019-11-06 10:19:46
我最初將其發(fā)布為僅關(guān)于析構(gòu)函數(shù)的問題,但現(xiàn)在我添加了對默認(rèn)構(gòu)造函數(shù)的考慮。這是原始問題:如果我想給我的類一個(gè)虛擬的析構(gòu)函數(shù),但在其他方面與編譯器生成的析構(gòu)函數(shù)相同,則可以使用=default:class Widget {public:   virtual ~Widget() = default;};但是似乎我可以通過使用空定義進(jìn)行更少的鍵入而獲得相同的效果:class Widget {public:   virtual ~Widget() {}};這兩種定義有什么不同的表現(xiàn)方式嗎?根據(jù)針對此問題發(fā)布的答復(fù),默認(rèn)構(gòu)造函數(shù)的情況似乎類似。既然對于析構(gòu)函數(shù),“ =default”和“ {}”之間的含義幾乎沒有差異,那么對于默認(rèn)構(gòu)造函數(shù),這些選項(xiàng)之間的含義幾乎也沒有差異嗎?也就是說,假設(shè)我要?jiǎng)?chuàng)建一個(gè)將同時(shí)創(chuàng)建和銷毀該類型的對象的類型,為什么我要說Widget() = default;代替Widget() {}?如果在發(fā)布原始問題后擴(kuò)展此問題違反了某些SO規(guī)則,我深感抱歉。為默認(rèn)構(gòu)造函數(shù)發(fā)布一個(gè)幾乎相同的問題令我震驚,因?yàn)樗遣惶硐氲倪x擇。
查看完整描述

3 回答

?
繁星coding

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

當(dāng)詢問構(gòu)造函數(shù)時(shí),這是一個(gè)與析構(gòu)函數(shù)完全不同的問題。


如霍華德指出virtual,如果您的析構(gòu)函數(shù)是,則差異可以忽略不計(jì)。但是,如果您的析構(gòu)函數(shù)不是虛擬的,那就完全不一樣了。構(gòu)造函數(shù)也是如此。


= default對特殊的成員函數(shù)(默認(rèn)構(gòu)造函數(shù),復(fù)制/移動(dòng)構(gòu)造函數(shù)/賦值,析構(gòu)函數(shù)等)使用語法意味著與簡單地做有很大的不同{}。使用后者,該功能將變?yōu)椤坝脩籼峁?。這改變了一切。


根據(jù)C ++ 11的定義,這是一個(gè)瑣碎的類:


struct Trivial

{

  int foo;

};

如果嘗試默認(rèn)構(gòu)造一個(gè),則編譯器將自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)。復(fù)制/移動(dòng)和銷毀也是如此。因?yàn)橛脩魶]有提供任何這些成員函數(shù),所以C ++ 11規(guī)范將其視為“瑣碎的”類。因此,這樣做是合法的,例如將其內(nèi)容memcpy初始化以此類推。


這個(gè):


struct NotTrivial

{

  int foo;


  NotTrivial() {}

};

顧名思義,這不再是瑣碎的事。它具有用戶提供的默認(rèn)構(gòu)造函數(shù)。它是否為空無關(guān)緊要;就C ++ 11的規(guī)則而言,這不能是瑣碎的類型。


這個(gè):


struct Trivial2

{

  int foo;


  Trivial2() = default;

};

顧名思義,這是一個(gè)瑣碎的類型。為什么?因?yàn)槟嬖V編譯器自動(dòng)生成默認(rèn)構(gòu)造函數(shù)。因此,構(gòu)造函數(shù)不是“用戶提供的”。因此,該類型被認(rèn)為是微不足道的,因?yàn)樗鼪]有用戶提供的默認(rèn)構(gòu)造函數(shù)。


= default當(dāng)添加阻止創(chuàng)建此類函數(shù)的成員函數(shù)時(shí),該語法主要用于執(zhí)行諸如復(fù)制構(gòu)造函數(shù)/賦值之類的操作。但是它還會(huì)觸發(fā)編譯器的特殊行為,因此它在默認(rèn)構(gòu)造函數(shù)/析構(gòu)函數(shù)中也很有用。


查看完整回答
反對 回復(fù) 2019-11-06
?
紅糖糍粑

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

他們都是不平凡的。


它們都具有相同的noexcept規(guī)范,具體取決于基礎(chǔ)和成員的noexcept規(guī)范。


到目前為止,我檢測到的唯一區(qū)別是,如果Widget包含具有不可訪問或刪除的析構(gòu)函數(shù)的基或成員:


struct A

{

private:

    ~A();

};


class Widget {

    A a_;

public:

#if 1

   virtual ~Widget() = default;

#else

   virtual ~Widget() {}

#endif

};

然后,=default解決方案將編譯,但Widget不會(huì)是可破壞的類型。即,如果您嘗試破壞Widget,則會(huì)收到編譯時(shí)錯(cuò)誤。但是,如果不這樣做,您就有一個(gè)有效的程序。


Otoh,如果您提供用戶提供的析構(gòu)函數(shù),則無論您是否解構(gòu)a,事情都不會(huì)編譯Widget:


test.cpp:8:7: error: field of type 'A' has private destructor

    A a_;

      ^

test.cpp:4:5: note: declared private here

    ~A();

    ^

1 error generated.


查看完整回答
反對 回復(fù) 2019-11-06
  • 3 回答
  • 0 關(guān)注
  • 5320 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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