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

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

類型名稱后的括號是否與new有區(qū)別?

類型名稱后的括號是否與new有區(qū)別?

C++ C
小怪獸愛吃肉 2019-05-28 17:09:03
類型名稱后的括號是否與new有區(qū)別?如果'Test'是一個普通的類,那么之間有什么區(qū)別:Test* test = new Test;和Test* test = new Test();
查看完整描述

3 回答

?
尚方寶劍之說

TA貢獻1788條經(jīng)驗 獲得超4個贊

讓我們變得迂腐,因為存在實際上會影響代碼行為的差異。以下大部分內(nèi)容來自對“Old New Thing”文章的評論。

有時新運算符返回的內(nèi)存將被初始化,有時它不會取決于您正在新建的類型是POD(普通舊數(shù)據(jù)),還是它是一個包含POD成員且正在使用的類編譯器生成的默認構造函數(shù)。

  • 在C ++ 1998中,有兩種類型的初始化:零和默認

  • 在C ++ 2003第三種類型的初始化中,添加了值初始化。

假設:

struct A { int m; }; // PODstruct B { ~B(); int m; }; // non-POD, compiler generated default ctorstruct C { C() : m() {}; ~C(); int m; }; 
// non-POD, default-initialising m

在C ++ 98編譯器中,應該發(fā)生以下情況:

  • new A - 不確定的價值

  • new A() - 零初始化

  • new B - 默認構造(B :: m未初始化)

  • new B() - 默認構造(B :: m未初始化)

  • new C - 默認構造(C :: m為零初始化)

  • new C() - 默認構造(C :: m為零初始化)

在符合C ++ 03的編譯器中,事情應該像這樣工作:

  • new A - 不確定的價值

  • new A() - value-initialize A,這是零初始化,因為它是POD。

  • new B - default-initializes(離開B :: m未初始化)

  • new B() - value-initializes B,它對所有字段進行零初始化,因為它的默認ctor是編譯器生成的,而不是用戶定義的。

  • new C - default-initializes C,調用默認的ctor。

  • new C() - value-initializes C,調用默認的ctor。

所以在C ++的所有版本中都存在差異new A,new A()因為A是POD。

在這種情況下,C ++ 98和C ++ 03之間的行為有所不同new B()

這是C ++塵封的角落之一,可以讓你發(fā)瘋。在構造一個物體時,有時候你需要/需要它們,有時候你絕對不能擁有它們,有時它們并不重要。


查看完整回答
反對 回復 2019-05-28
?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

new Thing();明確表示你想要一個被調用的構造函數(shù),而new Thing;這意味著你不介意不調用構造函數(shù)。

如果在具有用戶定義構造函數(shù)的struct / class上使用,則沒有區(qū)別。如果一個簡單的結構/類(如所謂的struct Thing { int i; };),那么new Thing;malloc(sizeof(Thing));,而new Thing();就像是calloc(sizeof(Thing));-它會初始化為零。

陷阱介于兩者之間:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;};

在這種情況下,new Thingy;vs 的行為new Thingy();在C ++ 98和C ++ 2003之間發(fā)生了變化。請參閱Michael Burr關于如何以及為何的解釋。


查看完整回答
反對 回復 2019-05-28
?
慕桂英546537

TA貢獻1848條經(jīng)驗 獲得超10個贊

不,他們是一樣的。但是有以下區(qū)別:

Test t;      // create a Test called t

Test t();   // declare a function called t which returns a Test

這是因為基本的C ++(和C)規(guī)則:如果某些東西可能是一個聲明,那么它就是一個聲明。

編輯:重新解決有關POD和非POD數(shù)據(jù)的初始化問題,雖然我同意所有已經(jīng)說過的內(nèi)容,但我只想指出這些問題僅適用于新的或以其他方式構建的內(nèi)容沒有用戶定義的構造函數(shù)。如果有這樣的構造函數(shù),它將被使用。對于99.99%的合理設計類,將會有這樣的構造函數(shù),因此可以忽略這些問題。


查看完整回答
反對 回復 2019-05-28
  • 3 回答
  • 0 關注
  • 794 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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