2011-10-04 62 views
4

在下面的代碼中,我似乎沒有理解大括號初始化的限制。他們究竟做了什麼?看起來在A的情況下,它只是直接設置[0]等於該值。在b的情況下,它使用隱式轉換。它是根據可用的內容決定選擇哪一個,還是使用其他方法?使用C++和Java進行卷曲括號初始化

#include <iostream> 

using namespace std; 

struct A 
{ 

}; 

struct B 
{ 
    B(int a) { cout << a; } 
}; 

int main() 
{ 
    A* a[] = {new A()}; 
    B b[] = {1};  
} 

此類型的大括號初始化在Java中的工作方式也是類似嗎?

public class A 
{ 
    public static void main(String[] args) 
    { 
      someClass[] sC = { /* what can go here? an argument to the constructor, 
           or just a value to set the variable equal to */ }. 
    } 
} 

很抱歉,如果我的問題似乎是愚蠢的,只是真的想知道更多關於C++的大括號和Java。在此先感謝:-)

+0

數組初始化列表? ,更多信息:http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Faryin.htm –

回答

5

由於Java部分已經被回答,所以我會添加一些關於C++部分的內容。 大括號初始化的具體版本稱爲聚合初始化和(不出所料)用於初始化聚合。彙總中的每個元素都將使用花括號中的相應元素進行初始化,並且您可以使用任何想要使用的內容,可以隱式地使用轉換爲彙總中元素的類型。

對於數組的特定情況,您可能需要考慮一些功能的特定部分。花括號內的元素數量不能大於數組的大小,但可以更小,在這種情況下,其餘元素將被默認初始化。

int a[5] = { 1, 2 }; // [ 1, 2, 0, 0, 0 ] 

如果用戶代碼不提供的陣列的大小,編譯器將其設置爲元素的在骨料初始化列表中的號碼:

int a[] = { 1, 2, 3 }; // int a[3] 

注意,不同於在Java中,大小是數組類型的一個組成部分,所以雖然你可以鍵入int a[] = { 1 };,但它永遠不可能是通用數組未定數字int

在C++ 11的大括號語法已經擴展到提供統一初始化,但是這可能是問題的範圍之外,我剛剛提到它如果你想了解更多關於學科。

1

我不太記得它是如何在C++中完成,但在Java中,你可以這樣做:

​​

所以你不要參數傳遞給構造函數,你傳遞對象本身。

2

這是在C++

someClass[] sC = { new someClass(), new someClass(), new someClass() }; 
int[] i = { 1, 2, 3 }; 
String[] s = { "1", "2", "3" }; 
1

在Java中,array容器對象同樣的事情。

您可以將基本類型和對象引用someClass或其sub-classes的值存儲到someClass[] sC的數組中。

class SomeClass {} 
class Foo extends SomeClass{} 

Foo f=new Foo(); 
SomeClass []sC={f,new Foo(),new SomeClass()}; 
+1

不僅引用,但也是基元類型的值。 –