class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
這是正確的嗎?如何使用成員初始化列表來初始化數組?
class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
這是正確的嗎?如何使用成員初始化列表來初始化數組?
在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
將是無效的。
不怕; 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)};
等待,而不是C++ 0x嗎? D: – GManNickG 2011-04-09 00:42:59
那麼,在C++ 0x中,理解(我希望!)你應該總是在C數組上使用'std :: array <>',它可以被合理且廉價地初始化並從靜態成員函數返回用於c'tor初始化列表中。 – ildjarn 2011-04-09 00:46:00
@GMan:的確如此。你不能用'std :: initializer_list <>'初始化一個數組,因爲數組沒有構造函數。您仍然最終在封閉類型的構造函數體中遍歷_something_。 ildjarn說,這不是真正的問題。 – 2011-04-09 01:55:00