文章

C++聚合类型

C++聚合类型是指没有用户自定义构造函数、没有私有/保护成员、没有虚函数、没有基类的简单类或结构体,可用花括号直接初始化。C++20 放宽限制,允许继承和默认成员初始化。

C++聚合类型

C++ 聚合类型

聚合类型(Aggregate Type) 是 C++ 中一种非常特殊的类或结构体类型,它的设计目的就是为了像数组一样像 C 语言结构体一样去初始化它 —— 不需要构造函数,不需要成员函数,所有成员按顺序初始化。这种类型在做 POD 类型、性能优化、序列化等低层场景非常有用。

聚合类型的定义(标准描述,C++17)

在 C++17 中,一个类类型如果满足以下所有条件,就叫做 聚合类型(aggregate)

  1. 没有用户声明的构造函数(包括默认构造函数)
  2. 没有私有或受保护的非静态数据成员
  3. 没有虚函数
  4. 没有基类(继承)
  5. 没有使用 = default 明确声明的构造函数
  6. 没有虚基类

从 C++20 起,标准略放宽了一些限制(比如允许 base class 也能是 aggregate)。

举例说明

聚合类型

1
2
3
4
struct Point {
    int x;
    int y;
};

它是聚合类型,因为:

  • 没有构造函数;
  • 所有成员都是 public;
  • 没有继承;
  • 没有虚函数。

它可以用“聚合初始化”:

1
Point p = {1, 2};  // ✅ 聚合初始化(按顺序初始化成员)

非聚合类型(有构造函数)

1
2
3
4
struct NotAggregate {
    int x;
    NotAggregate(int val) : x(val) {}
};
  • 有用户声明的构造函数;
  • 所以不是聚合类型;
  • 不能 NotAggregate obj = {1};

非聚合类型(有继承)

1
2
struct Base { int x; };
struct Derived : Base { int y; };  // ❌ 继承了 Base,不是聚合

C++17 中:不是聚合类型(因为继承) 在 C++20 中:是聚合类型(继承被允许)

所以可以这样初始化:

1
Derived d = { {1}, 2};  // 初始化 Base 的 x = 1,Derived 的 y = 2

聚合类型的用途

用途说明
快速初始化可以像数组一样用 {} 初始化
兼容 C 结构体(C 语言互操作)和 C 的 struct 一样
避免构造开销 / constexpr 场景比构造函数快、可以用在低层代码
标准库中的部分类型也用std::array<T, N> 是聚合类型(C++20 起)
本文由作者按照 CC BY 4.0 进行授权