C ++和Java中的Curly Bracket初始化

时间:2011-10-04 04:17:27

标签: java c++ arrays

在下面的代码中,我似乎不理解大括号初始化的局限性。他们到底做了什么?在A的情况下,它只是将[0]设置为直接等于该值。在b的情况下,它使用隐式转换。它是根据可用的内容决定做哪一个,还是使用其他方法?

#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中的花括号的信息。在此先感谢: - )

4 个答案:

答案 0 :(得分: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 };,但它永远不能是泛型数组< em>未确定 int的数量。

在C ++ 11中,大括号语法已经扩展为提供统一初始化,但这可能超出了问题的范围,我只是提到它如果您想了解更多有关该主题的信息。

答案 1 :(得分:2)

与C ++中的内容相同

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

答案 2 :(得分:1)

我不太清楚它是如何在C ++中完成的,但在java中你可以这样做:

String[] array = new String[]{ "a", "b", "c" };

因此,您不会将参数传递给构造函数,而是传递对象本身。

答案 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()};