簡體   English   中英

C ++中的默認初始化

[英]default initialization in C++

我對C ++中的默認初始化有疑問。 我被告知非POD對象將自動初始化。 但我對以下代碼感到困惑。

為什么當我使用指針時,變量i被初始化為0,但是,當我聲明一個局部變量時,它不是。 我使用g ++作為編譯器。

class INT {
    public: int i;

};

int main () {

    INT* myint1 = new INT;
    INT myint2;
    cout<<"myint1.i is "<<myint1->i<<endl;
    cout<<"myint2.i is "<<myint2.i<<endl;

    return 0;
}

輸出是

myint1.i是0

myint2.i是-1078649848

你需要在INT中聲明一個c'tor並強制'i'到一個明確定義的值。

class INT {
public:

    INT() : i(0) {}

 ...
};

i仍然是POD,因此默認情況下不會初始化。 無論是在堆棧上還是在堆上分配都沒有區別 - 在這兩種情況下,如果i未定義,則無關。

在這兩種情況下都沒有初始化,你很幸運在第一個中得到0

首先,你的INT類是POD。

其次,當某些內容“自動初始化”時(對於自動或動態對象),這意味着會自動調用構造函數 沒有其他“自動”初始化方案(對於自動或動態對象); 所有其他方案都需要“手動”指定的初始化程序。 但是,如果構造函數沒有執行任何操作來執行所需的初始化,則不會進行該初始化。 必要時,您有責任編寫該構造​​函數。

在您的示例中的兩種情況下,您都應該在對象中獲得垃圾。 在new-ed對象的情況下你觀察到的0純粹是偶然的。

這取決於編譯器。 這里最大的區別是設置為new Something的指針指的是堆中的某些內存區域,而局部變量存儲在堆棧中。 也許你的編譯器會將堆內存歸零,但不會打擾堆棧內存; 無論哪種方式,你都不能指望任何一種方法歸零你的記憶。 您應該使用Win32中的ZeroMemory或C標准庫中的memset來將內存歸零,或者在INT的構造函數中設置i = 0。

對於類或結構類型,如果在定義變量時沒有告訴它使用哪個構造函數,則調用默認構造函數。 如果您沒有定義默認構造函數,那么編譯器會為您創建一個。 如果類型不是類(或結構)類型,那么它不會被初始化,因為它沒有構造函數,更不用說默認構造函數了(所以沒有像int這樣的內置類型將被默認初始化)。

因此,在您的示例中,myint1和myint2都默認使用編譯器為INT聲明的默認構造函數構造。 但由於這不會初始化INT中的任何非類/結構變量,因此INT的i成員變量未初始化。

如果你想要初始化我,你需要為INT編寫一個默認構造函數來初始化它。

我們剛剛有了這個主題,你可以在這里找到一些說明。

如果向類中添加更多變量,則最終會得到非初始化的成員變量。

這對於非POD對象來說是正確的,但是你的對象是POD,因為它沒有用戶定義的構造函數,只包含POD本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM