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ā)瘋。在構造一個物體時,有時候你需要/需要它們,有時候你絕對不能擁有它們,有時它們并不重要。

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關于如何以及為何的解釋。

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ù),因此可以忽略這些問題。
- 3 回答
- 0 關注
- 794 瀏覽
添加回答
舉報