只使用一个构造函数调用的数组初始化
Array initialization with only one constructor call
在cpp中,这或类似的东西可能吗?
Foo bar[23] = Foo();
编辑:
这个问题的动机是,我想我看到有人使用这个语法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
并想知道它为什么要编译以及实际创建了多少新对象。。。
不使用此语法,但如果Foo
具有非平凡的默认值构造函数
Foo bar[23];
将为数组的每个成员调用它。更普遍地说,你也可以写入:
Foo bar[23] = { x, y, z... };
编译器将尝试转换每个初始值设定项(可以是任意表达式)转换为Foo
,并使用它初始化元素。如果没有足够的初始化器表达式,则下面的所有元件都将用CCD_ 3进行初始化。
编辑:
由于有几条评论要求:如果Foo没有用户定义构造函数,情况发生了变化(因为调用了"构造函数"不会做任何事情)。在这种情况下,的行为
Foo bar[23];
取决于变量的生存期:如果它有静态生存期,它将零初始化;否则,它根本不会被初始化。在任一在这种情况下,可以使用聚合初始化来强制初始化你想要:
Foo bar[23] = { { firstMember, secondMember... }, ... };
如果没有足够的初始值设定项,则剩余的元素为零初始化,所以:
Foo bar[23] = {};
将零初始化所有成员。
为了完整起见,我应该指出聚合初始化不能用于类成员:初始化C的唯一方法样式数组成员是通过在构造函数的主体,或通过复制初始化:定义静态Foo
并用它初始化成员。
我可能还应该指出,以上所有内容都涉及C++03。C++11引入了扩展的初始化语法;尤其是你可以对类使用类似于聚合初始化的东西成员。(我觉得我对C++11不是很熟悉我的所有编译器都支持它。)
如果你愿意使用std::vector
,你可以使用这个:
std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo()
您可以使用以下语法初始化数组:
struct Foo
{
};
Foo x[2] = {Foo(), Foo()};
//or
Foo y[] = {Foo(), Foo()};
在后一种情况下,数组的大小是从初始化中推导出来的。
尝试
Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ };
相关文章:
- uninit_member:非静态类成员m_wszParams未在此构造函数中初始化,也不在它C++中调用的任何函数中初
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 警告C26495函数调用从构造函数到初始化变量,原因
- 使用迭代函数调用初始化std::vector
- 使用函数调用初始化静态全局数据(在编译时)
- 在构造函数成员初始化之前调用成员函数的语法
- 使用函数调用初始化字符串成员c++
- 调用结构构造函数后初始化的值是什么
- C++:哪个先被调用/初始化?类构造函数或其成员变量的构造函数
- 调用构造函数来初始化变量
- 使用 init_seg 调用初始化函数
- 通过使用不同的参数调用每个元素的非默认构造函数来初始化std::vector,而不需要进行不必要的复制
- 调用已在另一个函数中初始化的类
- 使用函数调用初始化枚举值
- 我可以调用一个虚拟函数来初始化基类子对象吗
- 调用初始化列表构造函数的不同方式
- 是在第一次调用静态成员函数之前初始化的静态类变量
- 调用构造函数并初始化
- 如何(重新)调用初始化对象的构造函数
- 使用C与C++中的函数调用初始化全局变量