2012-08-23 62 views
3

我只是碰到這行代碼:使用C++對象初始化括號(語法)

SDL_Color textColor = { 255, 0, 255 }; 

這讓我想知道爲什麼它可以聲明如下數組。我認爲這可能只是textColor(255,0,255);,但是當我嘗試製作自己的課程時,它沒有像那樣工作。任何人都可以解釋何時使用這種類型的語法?參數去哪裏..?

回答

10

它是一個類型的aggregate initialization,很可能是一個簡單的結構或類。例如,

struct Foo 
{ 
    int i,j; 
    double x,y; 
}; 

int main() 
{ 
    Foo f = {1,2, 3.,4.}; 
} 

因爲存在關於structs有些混亂,上面的例子中也將與class,在這種情況下是相同的struct工作:

class Foo 
{ 
public: 
    int i,j; 
    double x,y; 
}; 

在C++ 11這種類型的初始化在某些條件下是extended to non-aggregate types

例如

std::vector<int> v = {1,2,3,4,5}; 
+0

+1第一個提到C++ 11 –

+0

由於一個類也會嵌套數據成員,這是否意味着一個類的對象可以以同樣的方式初始化? – user1534664

+0

@ user1534664是的,如果它滿足聚合的條件。在這個意義上,'struct'和'class'是相同的。 – juanchopanza

1

SDL_Color集合(具有4個成員的一個struct在這種情況下)。

您可以使用初始化程序列表來初始化一個聚合(不僅僅是一個數組)。

SDL_Color textColor = { 255, 0, 255 }; 

相同

SDL_Color textColor; 
textColor.r = 255; 
textColor.g = 0; 
textColor.b = 255; 
textColor.unused = 0; 
+0

我想你指的3名成員,而不是4 :) –

+0

@KirilKirov:其實,它有4名成員。 – Mankarse

+0

@KirilKirov:不,第四個是'Uint8 unused' – Andrey

3

所有聚集體可以振奮初始化,其初始化與所述匹配項每個聚集構件。如果列表中的項目數比聚合成員數量少,則剩餘的元素將像從空的大括號列表中進行初始化。

+0

刪除了我的答案,因爲我在某些時候明顯錯誤。從標準來看:_An是沒有用戶提供的構造函數(12.1)的數組或類(第9章),非靜態數據成員(9.2)沒有括號或等於初始值 ,沒有私有或受保護的非靜態數據成員(第11章), 沒有基類(第10章),也沒有虛函數(10.3)。我想你所指出的一點是,儘管它可能是一個'struct',它可能有任何列表阻止它成爲聚合的功能? – hmjd

+0

呃。聚合是通常非正式用法的結構。當然,你可以在技術上擁有像結構一樣的'類'和類'結構'。但是除了技術上的細微差別之外,我們通常還會選擇'class'或'struct'的內涵和原因。 – aschepler

+0

@hmjd'struct'和'class'在這方面是一樣的。它們都可以是聚合的,或者不是。我在我的答案中添加了一個註釋。 – juanchopanza