在cpp中,这或类似的可能吗?
Foo bar[23] = Foo();
编辑:
问题的动机是我认为我看到有人使用这种语法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
并想知道它为什么编译以及实际创建了多少新对象......
答案 0 :(得分:7)
不使用此语法,但如果Foo
具有非平凡的默认值
构造,
Foo bar[23];
将为数组的每个成员调用它。更一般地说,你也可以 写:
Foo bar[23] = { x, y, z... };
编译器将尝试转换每个初始化程序(可以是
任意表达式)到Foo
,并用它来初始化
数组的元素。如果没有足够的初始化表达式,
然后,所有以下元素将使用Foo()
进行初始化。
编辑:
由于有几条评论要求它:如果Foo没有用户定义 构造函数,情况发生变化(因为调用“构造函数”) 不会做任何事情)。在这种情况下,行为:
Foo bar[23];
取决于变量的生命周期:如果它有静态生命周期,它将是 零初始化;否则,它根本不会被初始化。在任何一个 例如,您可以使用聚合初始化来强制初始化 你想要的:
Foo bar[23] = { { firstMember, secondMember... }, ... };
如果没有足够的初始值设定项,则剩余的元素为零 初始化,所以:
Foo bar[23] = {};
将零初始化所有成员。
为了完整性,我应该指出聚合初始化
不能用于类成员:只能初始化C的方法
样式数组成员是通过赋值给每个元素的
构造函数的主体,或通过复制初始化:定义静态
Foo
并使用它初始化成员。
我应该也指出,以上所有都是指C ++ 03。 C ++ 11引入了扩展初始化语法;特别是你 可以使用看起来像类的聚合初始化的东西 成员也是。 (我想 - 我不太熟悉C ++ 11,不是 我的所有编译器都支持它。)
答案 1 :(得分:3)
如果您愿意使用std::vector
,可以使用:
std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo()
答案 2 :(得分:1)
您可以使用以下语法初始化数组:
struct Foo
{
};
Foo x[2] = {Foo(), Foo()};
//or
Foo y[] = {Foo(), Foo()};
在后一种情况下,数组的大小是从初始化推断出来的。
答案 3 :(得分:0)
尝试
Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ };