3 回答

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個贊
讓我們變得迂腐,因?yàn)榇嬖趯?shí)際上會影響代碼行為的差異。以下大部分內(nèi)容來自對“Old New Thing”文章的評論。
有時新運(yùn)算符返回的內(nèi)存將被初始化,有時它不會取決于您正在新建的類型是POD(普通舊數(shù)據(jù)),還是它是一個包含POD成員且正在使用的類編譯器生成的默認(rèn)構(gòu)造函數(shù)。
在C ++ 1998中,有兩種類型的初始化:零和默認(rèn)
在C ++ 2003第三種類型的初始化中,添加了值初始化。
假設(shè):
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編譯器中,應(yīng)該發(fā)生以下情況:
new A
- 不確定的價值new A()
- 零初始化new B
- 默認(rèn)構(gòu)造(B :: m未初始化)new B()
- 默認(rèn)構(gòu)造(B :: m未初始化)new C
- 默認(rèn)構(gòu)造(C :: m為零初始化)new C()
- 默認(rèn)構(gòu)造(C :: m為零初始化)
在符合C ++ 03的編譯器中,事情應(yīng)該像這樣工作:
new A
- 不確定的價值new A()
- value-initialize A,這是零初始化,因?yàn)樗荘OD。new B
- default-initializes(離開B :: m未初始化)new B()
- value-initializes B,它對所有字段進(jìn)行零初始化,因?yàn)樗哪J(rèn)ctor是編譯器生成的,而不是用戶定義的。new C
- default-initializes C,調(diào)用默認(rèn)的ctor。new C()
- value-initializes C,調(diào)用默認(rèn)的ctor。
所以在C ++的所有版本中都存在差異new A
,new A()
因?yàn)锳是POD。
在這種情況下,C ++ 98和C ++ 03之間的行為有所不同new B()
。
這是C ++塵封的角落之一,可以讓你發(fā)瘋。在構(gòu)造一個物體時,有時候你需要/需要它們,有時候你絕對不能擁有它們,有時它們并不重要。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個贊
new Thing();
明確表示你想要一個被調(diào)用的構(gòu)造函數(shù),而new Thing;
這意味著你不介意不調(diào)用構(gòu)造函數(shù)。
如果在具有用戶定義構(gòu)造函數(shù)的struct / class上使用,則沒有區(qū)別。如果一個簡單的結(jié)構(gòu)/類(如所謂的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關(guān)于如何以及為何的解釋。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
不,他們是一樣的。但是有以下區(qū)別:
Test t; // create a Test called t
和
Test t(); // declare a function called t which returns a Test
這是因?yàn)榛镜腃 ++(和C)規(guī)則:如果某些東西可能是一個聲明,那么它就是一個聲明。
編輯:重新解決有關(guān)POD和非POD數(shù)據(jù)的初始化問題,雖然我同意所有已經(jīng)說過的內(nèi)容,但我只想指出這些問題僅適用于新的或以其他方式構(gòu)建的內(nèi)容沒有用戶定義的構(gòu)造函數(shù)。如果有這樣的構(gòu)造函數(shù),它將被使用。對于99.99%的合理設(shè)計類,將會有這樣的構(gòu)造函數(shù),因此可以忽略這些問題。
- 3 回答
- 0 關(guān)注
- 800 瀏覽
添加回答
舉報