2011-04-09 107 views

回答

19

在C++ 03中,使用C數組可以做的唯一明智的事情是對它進行值初始化(在C++ 11中,它可以被列表初始化)。

從C++ 03標準,第8.5節/ 7:

其初始化爲空集括號的一個目的,即(),應值初始化。

並從§8。5/5:

值初始化T類型的對象是指:

  • 如果T是與用戶聲明的構造函數的類型,那麼對於T默認構造函數被調用(如果T沒有可訪問的默認構造函數,則初始化不合格);
  • 如果T是沒有一個用戶聲明的構造的非聯合類型,那麼T每個非靜態數據成員和基礎類組分是值初始化;
  • 如果T是數組類型,則每個元素是值初始化;
  • 否則,該目的是零初始化

零初始化T類型的對象是指:

  • 如果T是標量類型,對象是設置爲0(零)的值轉換爲T;
  • 如果T爲非聯合類類型,每個非靜態數據成員,並且每個基礎類子對象是零初始化;
  • 如果T是聯合類型,所述對象的第一命名的數據成員)是零初始化;
  • 如果T是數組類型,每一個元素是零初始化;
  • 如果T是引用類型,則不執行初始化。

所以,如果你的構造函數的定義改爲

A::A() : a(), ptr() { } 

那麼你是保證後期施工中,A::a所有5個元素的值將'\0'A::ptr將是無效的。

3

不怕; C++不支持像這樣初始化數組。

你只需要分配給其成員A的構造體,也可以使用值初始化,如果你真的不關心什麼值

struct A { 
    int x[5]; 
    A() : x(); 
}; 

Ç ++ 0x中確實讓你把所有的值,但:

struct A { 
    int x[5]; 
    A() : x{1,2,3,4,5} {} 
}; 

注意,雖然,因爲數組不是class-object S,你將不能夠做到這一點:

struct A { 
    int x[5]; 
    A(std::initializer_list<int[5]>& i) // or whatever the T should be 
     : x{i} // or x(i) 
     {} 
} 
A a({1,2,3,4,5)}; 
+0

等待,而不是C++ 0x嗎? D: – GManNickG 2011-04-09 00:42:59

+0

那麼,在C++ 0x中,理解(我希望!)你應該總是在C數組上使用'std :: array <>',它可以被合理且廉價地初始化並從靜態成員函數返回用於c'tor初始化列表中。 – ildjarn 2011-04-09 00:46:00

+0

@GMan:的確如此。你不能用'std :: initializer_list <>'初始化一個數組,因爲數組沒有構造函數。您仍然最終在封閉類型的構造函數體中遍歷_something_。 ildjarn說,這不是真正的問題。 – 2011-04-09 01:55:00

相關問題