C++聚合类型
C++ 聚合类型
聚合类型(Aggregate Type)是 C++ 中一种非常特殊的类或结构体类型,它的设计目的就是为了像数组一样、像 C 语言结构体一样去初始化它 —— 不需要构造函数,不需要成员函数,所有成员按顺序初始化。这种类型在做 POD 类型、性能优化、序列化等低层场景非常有用。
定义
在 C++17 中,一个类类型如果满足以下所有条件,就叫做 聚合类型(aggregate):
- 没有用户声明的构造函数(包括默认构造函数)
- 没有私有或受保护的非静态数据成员
- 没有虚函数
- 没有基类(继承)
- 没有使用
= default明确声明的构造函数 - 没有虚基类
从 C++20 起,标准略放宽了一些限制(比如允许 base class 也能是 aggregate)。
示例
聚合类型
struct Point {
int x;
int y;
};
它是聚合类型,因为:
- 没有构造函数;
- 所有成员都是 public;
- 没有继承;
- 没有虚函数。
它可以用“聚合初始化”:
Point p = {1, 2}; // 聚合初始化(按顺序初始化成员)
- 大括号初始化(brace-init-list)是 C++11 引入的统一初始化语法,可以用于很多场景,比如初始化普通变量、容器、类对象等。
- 聚合初始化(aggregate initialization) 是大括号初始化的一个特例,专门用于聚合类型(aggregate type)的初始化。
非聚合类型(有构造函数)
struct NotAggregate {
int x;
NotAggregate(int val) : x(val) {}
};
- 有用户声明的构造函数;
- 所以不是聚合类型;
- 不能
NotAggregate obj = {1};。
非聚合类型(有继承)
struct Base { int x; };
struct Derived : Base { int y; }; // 继承了 Base,不是聚合
在 C++17 中:不是聚合类型(因为继承)
在 C++20 中:是聚合类型(继承被允许)
所以可以这样初始化:
Derived d = {{1}, 2}; // 初始化 Base 的 x = 1,Derived 的 y = 2
用途
| 用途 | 说明 |
|---|---|
| 快速初始化 | 可以像数组一样用 {} 初始化 |
| 兼容 C 结构体(C 语言互操作) | 和 C 的 struct 一样 |
| 避免构造开销 / constexpr 场景 | 比构造函数快、可以用在低层代码 |
| 标准库中的部分类型也用 | 如 std::array<T, N> 是聚合类型(C++20 起) |

浙公网安备 33010602011771号