聚合初始化

摘自时习之
C++标准库中提供两个容器表示数组这个概念:array表示静态数组,vector表示动态数组 。这两个类型都可以使用列表初始化(list initilization)来初始化。

std::array<int, 5> = {1, 2, 3, 4, 5};
std::vector<int>   = {1, 2, 3, 4, 5};

这实际上是聚合初始化。
聚合初始化其实由来已久,在C语言中就存在了。

int array[5] = {1, 2, 3, 4, 5};

在C++中对于聚合体(aggregate)的初始化称为聚合初始化,可以使用上面这种语法。 有两种类型的对象被称为聚合体:

  • 数组类型
  • 满足下列条件的类类型(通常是结构体(struct)或者联合体(union)):
    • 没有私有或保护的非静态数据成员
    • 没有用户提供的构造函数
    • 没有基类
    • 没有虚函数

所以说下面这个结构体的对象可以使用聚合初始化:

struct Aggregate {
    int i;
    int j;
};

Aggregate aggr = {1, 2};

上面这些都没什么神奇的,真正神奇的是如果你的聚合体中间有嵌套,你可以不用使用花 括号分割:

struct Aggregate {
    int arr[4];
    int j;
};

Aggregate aggr = {1, 2, 3, 4, 5};

在上面这个初始化中,arr 成员会得到{1, 2, 3, 4}, 而 j 成员会初始化成 5 。

posted @ 2018-11-29 17:11  narjaja  阅读(3329)  评论(0编辑  收藏  举报