这叫什么?
Vec3 foo = {1,2,3};
可以通过操作员或某些人控制吗?我可以指定这应该如何行动吗?
例如,如果我有一些复杂的类,我可以使用它来分配变量吗? (只是好奇心练习)。
答案 0 :(得分:43)
这不是任务。那是初始化。
这种初始化仅允许聚合,包括POD类。 POD表示普通旧数据类型。
实施例,
//this struct is an aggregate (POD class)
struct point3D
{
int x;
int y;
int z;
};
//since point3D is an aggregate, so we can initialize it as
point3D p = {1,2,3};
请参阅上面的编译:http://ideone.com/IXcSA
但请再考虑一下:
//this struct is NOT an aggregate (non-POD class)
struct vector3D
{
int x;
int y;
int z;
vector3D(int, int, int){} //user-defined constructor!
};
//since vector3D is NOT an aggregate, so we CANNOT initialize it as
vector3D p = {1,2,3}; //error
以上不编译。它给出了这个错误:
prog.cpp:15:错误:在非聚合类型'vector3D'的初始化器周围括起来
point3D
和vector3D
之间有什么区别?只有vector3D
具有用户定义的构造函数,这使得它不是POD。因此无法使用花括号初始化它!
标准在第8.5.1 / 1节中说明,
聚合数组或类 (第9条)没有用户声明 构造函数(12.1),没有私有或 受保护的非静态数据成员 (第11条),无基类(条款 10),无虚函数(10.3)。
然后它在§8.5.1/ 2中说,
当聚合初始化时 初始化程序可以包含 initializer-clause由a组成 括号括起来,以逗号分隔的列表 初始化者 - 条款成员 总计,写的越来越多 下标或成员顺序。如果 aggregate包含subaggregates,this 规则递归地应用于 分团成员。
[Example:
struct A
{
int x;
struct B
{
int i;
int j;
} b;
} a = { 1, { 2, 3 } };
initializes a.x with 1, a.b.i with 2, a.b.j with 3. ]