簡體   English   中英

C++中POD類型的默認初始化

[英]Default initialization of POD types in C++

我知道一些POD變量是默認初始化的,但其他的不是。 (POD 類型包括intfloat 、指針、聯合、POD 類型的數組、POD 類型的結構體等)

范圍和存儲類如何影響 POD 類型的默認初始化?

具體來說,以下哪些會被隱式初始化:

  • 具有自動存儲的局部變量
  • 靜態局部變量
  • 靜態全局變量
  • 外部變量
  • new分配的變量
  • 類的 POD 成員(在構造函數中沒有顯式初始化)

我知道存在與其中一些情況相關的問題,但都不全面(它們僅針對特定情況)。

具有自動存儲持續時間的局部變量不會被自動初始化。 由於使用未初始化的變量會產生未定義的行為,因此即使變量是多余的,顯式初始化它也是一個好習慣。

關於被零初始化的 POD 類型,C++03 標准3.6.2 非本地對象的初始化聲明:

§1具有靜態存儲持續時間(3.7.1) 的對象應在任何其他初始化發生之前進行零初始化(8.5)。 零初始化和用常量表達式初始化統稱為靜態初始化; 所有其他初始化都是動態初始化。 具有用常量表達式 (5.19) 初始化的靜態存儲持續時間的 POD 類型 (3.9) 的對象應在任何動態初始化發生之前進行初始化。

因此,標准保證具有靜態存儲持續時間(無論其范圍如何)的 POD 類型將被零初始化。

類的 POD 成員(在構造函數中沒有顯式初始化)

這種情況在12.6.2 Initializing bases and members 中描述,其中指出(選定部分):

如果給定的非靜態數據成員或基類不是由 mem-initializer-id 命名的(包括由於構造函數沒有 ctor-initializer 而沒有 mem-initializer-list 的情況),則:

— 如果實體是非靜態數據成員...,並且實體類是非 POD類,則實體默認初始化(8.5)...

否則,實體未初始化...

在對類 X 的構造函數的調用完成后,如果 X 的成員既沒有在構造函數的 mem-initializers 中指定,也沒有被默認初始化,也沒有被初始化,也沒有在構造函數體的執行過程中給定值,該成員具有不確定的價值。

例子:

class C
{
public:
    C(int x, int z) : x(x), z(z) { }
    int x, y, z;
};

int main(void)
{
    C* c = new C(1,3);
    std::cout << c->y; // value of y is undetermined !!!
}

如果我們只討論 POD,那么只有局部和全局靜態以及外部變量,因為它們必須在某處定義。

使用new分配的 POD有時也會被初始化 - 如果您明確初始化:

int* x = new int();

將創建一個初始化為0x指向它的int ,而

int* x = new int;

將使x指向一個未初始化的int

有時 - POD 類成員- 它們可以顯式初始化(​​無需在構造函數中):

struct X
{
   int x;
};

X x;        //x.x is not initialized
X y = X();  //y.x is 0

暫無
暫無

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

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