c++和Java中的大括号初始化

Curly Bracket Initialization in C++ and Java

本文关键字:初始化 Java c++      更新时间:2023-10-16

在下面的代码中,我似乎不理解花括号初始化的局限性。他们实际上是做什么的?似乎在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中的花括号。提前感谢:-)

既然Java部分已经回答了,我将添加一些关于c++部分的内容。您所引用的大括号初始化的特定版本称为聚合初始化,并且(毫不奇怪)用于初始化聚合。聚合中的每个元素都将使用大括号内相应的元素初始化,并且可以使用任何可以隐式转换为聚合中元素类型的元素。

对于数组的特定情况,您可能需要考虑该特性的几个特定部分。花括号内的元素个数不能大于数组的大小,但可以小于数组的大小,在这种情况下,其余元素将被默认初始化。

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

如果用户代码中没有提供数组的大小,编译器会将其设置为aggregate-initialization列表中的元素个数:

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

请注意,与Java不同,大小是数组类型的一个组成部分,因此当您可以键入int a[] = { 1 };时,它永远不能是泛型数组,int未确定数量。

在c++ 11中,花括号语法已经扩展为提供统一初始化,但这可能超出了问题的范围,我只是提到它,以防您想要阅读更多关于该主题的内容。

这和c++中的

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

我不太记得在c++中是怎么做的,但是在java中你可以这样做:

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

所以你不传递参数给构造函数,你传递对象本身。

在Java中,array是一个容器对象。

可以将基本类型的值和someClasssub-classes的对象引用存储到someClass[] sC的数组中。

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