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

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

默認構造函數和析構函數的“ = default”與“ {}”有何不同?

默認構造函數和析構函數的“ = default”與“ {}”有何不同?

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

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

當詢問構造函數時,這是一個與析構函數完全不同的問題。


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


= default對特殊的成員函數(默認構造函數,復制/移動構造函數/賦值,析構函數等)使用語法意味著與簡單地做有很大的不同{}。使用后者,該功能將變為“用戶提供”。這改變了一切。


根據C ++ 11的定義,這是一個瑣碎的類:


struct Trivial

{

  int foo;

};

如果嘗試默認構造一個,則編譯器將自動生成一個默認構造函數。復制/移動和銷毀也是如此。因為用戶沒有提供任何這些成員函數,所以C ++ 11規范將其視為“瑣碎的”類。因此,這樣做是合法的,例如將其內容memcpy初始化以此類推。


這個:


struct NotTrivial

{

  int foo;


  NotTrivial() {}

};

顧名思義,這不再是瑣碎的事。它具有用戶提供的默認構造函數。它是否為空無關緊要;就C ++ 11的規則而言,這不能是瑣碎的類型。


這個:


struct Trivial2

{

  int foo;


  Trivial2() = default;

};

顧名思義,這是一個瑣碎的類型。為什么?因為您告訴編譯器自動生成默認構造函數。因此,構造函數不是“用戶提供的”。因此,該類型被認為是微不足道的,因為它沒有用戶提供的默認構造函數。


= default當添加阻止創建此類函數的成員函數時,該語法主要用于執行諸如復制構造函數/賦值之類的操作。但是它還會觸發編譯器的特殊行為,因此它在默認構造函數/析構函數中也很有用。


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

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

他們都是不平凡的。


它們都具有相同的noexcept規范,具體取決于基礎和成員的noexcept規范。


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


struct A

{

private:

    ~A();

};


class Widget {

    A a_;

public:

#if 1

   virtual ~Widget() = default;

#else

   virtual ~Widget() {}

#endif

};

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


Otoh,如果您提供用戶提供的析構函數,則無論您是否解構a,事情都不會編譯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.


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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