c++和Java中的大括号初始化
Curly Bracket Initialization in C++ and Java
在下面的代码中,我似乎不理解花括号初始化的局限性。他们实际上是做什么的?似乎在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是一个容器对象。
可以将基本类型的值和someClass
或sub-classes
的对象引用存储到someClass[] sC
的数组中。
class SomeClass {}
class Foo extends SomeClass{}
Foo f=new Foo();
SomeClass []sC={f,new Foo(),new SomeClass()};
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 是否可以在C++中推迟 const 变量的初始化,例如 Java 的"blank final"功能?
- 初始化列表:使用C 与Java中的构造函数
- 创建数组数组 (2D),而无需在 Java 中初始化内部数组
- 为什么在java中可以用变量初始化数组作为长度
- 什么等效于C/C++中的java静态最终成员变量,以及如何通过一些计算对其进行初始化
- Java可以初始化类似C++的对象数组中的对象,而不必循环和调用new
- 需要解释这个Java对象初始化语法
- 调用本机(DLL)代码从Java使用JNI保持变量c++初始化每个新的召回函数
- c++ /Java递归变量初始化
- 为什么 java 不允许在方法中初始化静态变量?
- c++和Java中的大括号初始化
- Java风格的静态常量初始化
- 正在初始化非静态成员:C++和Java比较
- Java中是否存在类似C++的成员初始化列表语法
- 在哪里为已初始化的java中的数据成员分配的内存@声明点..
- for 循环初始化变量范围在 C++、Java、C# 之间