C++ 仅使用一个构造函数调用进行数组初始化
在cpp中,这是可能的吗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] =
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] = {};