3 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
隱式定義(由編譯器)類的默認(rèn)構(gòu)造函數(shù)不初始化內(nèi)置類型的成員。
但是,您必須記住,在某些情況下,可以通過其他方式執(zhí)行類實(shí)例的初始化。不是默認(rèn)構(gòu)造函數(shù),也不是構(gòu)造函數(shù)。
例如,有一種普遍的錯(cuò)誤信念,即對(duì)于類C,語(yǔ)法C()總是調(diào)用默認(rèn)構(gòu)造函數(shù)。但實(shí)際上,語(yǔ)法C()執(zhí)行所謂 的類實(shí)例的值初始化。如果是用戶聲明的,它只會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。(那是在C ++ 03中。在C ++ 98中 - 只有當(dāng)類是非POD時(shí))。如果類沒有用戶聲明的構(gòu)造函數(shù),那么C()它將不會(huì)調(diào)用編譯器提供的默認(rèn)構(gòu)造函數(shù),而是執(zhí)行一種特殊的初始化,它根本不涉及構(gòu)造函數(shù)C。相反,它將直接初始化類的每個(gè)成員。對(duì)于內(nèi)置類型,它會(huì)導(dǎo)致零初始化。
例如,如果您的類沒有用戶聲明的構(gòu)造函數(shù)
class C {
int x;
};
然后編譯器將隱式提供一個(gè)。編譯器提供的構(gòu)造函數(shù)將不執(zhí)行任何操作,這意味著它不會(huì)初始化C::x
C c; // Compiler-provided default constructor is used
// Here `c.x` contains garbage
然而,以下初始化將零初始化,x因?yàn)樗鼈兪褂蔑@式()初始化器
C c = C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(c.x == 0);
C *pc = new C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(pc->x == 0);
()初始化程序的行為在C ++ 98和C ++ 03之間在某些方面是不同的,但在這種情況下不是這樣。對(duì)于上面的類C,它將是相同的:()初始化器執(zhí)行零初始化C::x。
在不涉及構(gòu)造函數(shù)的情況下執(zhí)行的初始化的另一個(gè)示例當(dāng)然是聚合初始化
C c = {}; // Does not use any `C` constructors at all. Same as C c{}; in C++11.
assert(c.x == 0);
C d{}; // C++11 style aggregate initialization.
assert(d.x == 0);

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
出于所有實(shí)際目的 - 沒有。
但是,對(duì)于技術(shù)上符合C ++標(biāo)準(zhǔn)的實(shí)現(xiàn),答案是它取決于對(duì)象是否是POD以及如何初始化它。根據(jù)C ++標(biāo)準(zhǔn):
MyNonPodClass instance1;//built in members will not be initialized
MyPodClass instance2;//built in members will be not be initialized
MyPodClass* instance3 = new MyPodClass;//built in members will not be initialized
MyPodClass* instance3 = new MyPodClass() ;//built in members will be zero initialized
但是,在現(xiàn)實(shí)世界中,這并沒有得到很好的支持,所以不要使用它。
標(biāo)準(zhǔn)的相關(guān)部分是第8.5.5和8.5.7節(jié)

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
我不太確定你的意思,但是:
struct A { int x; };
int a; // a is initialized to 0
A b; // b.x is initialized to 0
int main() {
int c; // c is not initialized
int d = int(); // d is initialized to 0
A e; // e.x is not initialized
A f = A(); // f.x is initialized to 0
}
在我說(shuō)“未初始化”的每種情況下 - 您可能會(huì)發(fā)現(xiàn)編譯器為其提供了一致的值,但標(biāo)準(zhǔn)并不要求它。
包括我在內(nèi)的很多揮手問題都是關(guān)于內(nèi)置類型“有效”的默認(rèn)構(gòu)造函數(shù)。實(shí)際上,默認(rèn)初始化和值初始化是標(biāo)準(zhǔn)中定義的術(shù)語(yǔ),我個(gè)人每次都必須查找。只有標(biāo)準(zhǔn)中定義的類才具有隱式默認(rèn)構(gòu)造函數(shù)。
- 3 回答
- 0 關(guān)注
- 651 瀏覽
添加回答
舉報(bào)