什么是花括号的赋值?它可以控制吗?

时间:2011-04-14 16:18:47

标签: c++

这叫什么?

Vec3 foo = {1,2,3};

可以通过操作员或某些人控制吗?我可以指定这应该如何行动吗?

例如,如果我有一些复杂的类,我可以使用它来分配变量吗? (只是好奇心练习)。

1 个答案:

答案 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'的初始化器周围括起来

自己看看:http://ideone.com/zO58c

point3Dvector3D之间有什么区别?只有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. ]