C++和Java中的花括号初始化

4
在下面的代码中,我似乎不理解花括号初始化的限制。它们实际上是做什么的?在A的情况下,它只是直接将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中的花括号。谢谢!:-)


数组初始化列表?更多信息请参见:http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Faryin.htm - Mr.Anubis
4个回答

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中,花括号语法已被扩展以提供统一初始化,但这可能超出了问题的范围,我只是提到它以防您想更深入地了解这个主题。

2

这与C++中的相同。

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

1
在Java中,array是一个容器对象。
您可以将原始类型的值和someClass或其子类的对象引用存储到someClass[] sC数组中。
class SomeClass {}
class Foo extends SomeClass{}

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

1
不仅是引用类型,也包括原始数据类型的值。 - David Rodríguez - dribeas

1

我不太记得C++中是怎样实现的,但在Java中可以这样做:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接