Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅使用一个构造函数调用进行数组初始化_C++_Arrays - Fatal编程技术网

C++ 仅使用一个构造函数调用进行数组初始化

C++ 仅使用一个构造函数调用进行数组初始化,c++,arrays,C++,Arrays,在cpp中,这是可能的吗 Foo bar[23] = Foo(); 编辑: 这个问题的动机是,我想我看到有人在使用这种语法 vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New(); vtkSmartPointer条[23]=vtkSmartPointer::New(); 还想知道它为什么要编译以及实际创建了多少新对象…您可以使用以下语法初始化数组: struct Foo { }; Foo x[2] =

在cpp中,这是可能的吗

Foo bar[23] = Foo();
编辑:

这个问题的动机是,我想我看到有人在使用这种语法

vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
vtkSmartPointer条[23]=vtkSmartPointer::New();

还想知道它为什么要编译以及实际创建了多少新对象…

您可以使用以下语法初始化数组:

struct Foo
{
};

Foo x[2] = {Foo(), Foo()};
//or
Foo y[] = {Foo(), Foo()};
在后一种情况下,数组的大小是从初始化中推导出来的。

Try

Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ };

如果您愿意使用
std::vector
,您可以使用:

std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo()
std::向量条(23,Foo());//使用23个Foo()副本初始化bar

不使用此语法,但如果
Foo
有一个非常重要的默认值 建造师

Foo bar[23];
将为数组的每个成员调用它。一般来说,您还可以 写:

编译器将尝试转换每个初始值设定项(可以是 任意表达式)转换为
Foo
,并使用该表达式初始化 数组的元素。如果没有足够的初始值设定项表达式, 然后将使用
Foo()
初始化以下所有元素

编辑:

因为有几条评论要求:如果Foo没有用户定义 构造函数,情况会发生变化(调用“构造函数”后) 不会做任何事)。在这种情况下,以下行为:

Foo bar[23];
取决于变量的生存期:如果它有静态生存期,它将是 零初始化;否则,它将根本无法初始化。在任何一种情况下 在这种情况下,可以使用聚合初始化强制初始化 你想要:

Foo bar[23] = { { firstMember, secondMember... }, ... };
如果没有足够的初始值设定项,则剩余的元素为零 已初始化,因此:

Foo bar[23] = {};
将初始化所有成员

为了完整性,我应该指出聚合初始化 不能用于类成员:初始化C 样式数组成员是通过指定给 构造函数的主体,或通过复制初始化:定义静态
Foo
并使用它初始化成员

我可能还应该指出,以上所有内容都涉及C++03。 C++11引入了扩展的初始化语法;特别是你 可以使用类似于类的聚合初始化的东西 成员们也是。(我想——我对C++11也不太熟悉
我所有的编译器都支持它。)

在哪里可以看到构造函数初始值设定项列表?没有必要,因为编译器无论如何都会这样做。好吧,对于默认初始化,当然可以,但我假设OP希望获得比这更大的灵活性。或者只是
std::vector bar(23)
,它用23个默认构造的
Foo
对象初始化了
bar
(在C++11中;通常是一个轻微的优化)。+1一个很好的概要。为了更彻底,也许可以在这里添加一些关于POD结构行为的内容?我同意Karl的观点:最终未初始化的类型
Foo
的行为可能是一个陷阱。这意味着什么?所有的
Foo-bar[i]==f
?他们每个人都有一个新的Foo()。。。
Foo bar[23] = {};