C++聚合类型
C++聚合类型是指没有用户自定义构造函数、没有私有/保护成员、没有虚函数、没有基类的简单类或结构体,可用花括号直接初始化。C++20 放宽限制,允许继承和默认成员初始化。
C++聚合类型
C++ 聚合类型
聚合类型(Aggregate Type) 是 C++ 中一种非常特殊的类或结构体类型,它的设计目的就是为了像数组一样、像 C 语言结构体一样去初始化它 —— 不需要构造函数,不需要成员函数,所有成员按顺序初始化。这种类型在做 POD 类型、性能优化、序列化等低层场景非常有用。
聚合类型的定义(标准描述,C++17)
在 C++17 中,一个类类型如果满足以下所有条件,就叫做 聚合类型(aggregate):
- 没有用户声明的构造函数(包括默认构造函数)
- 没有私有或受保护的非静态数据成员
- 没有虚函数
- 没有基类(继承)
- 没有使用
= default
明确声明的构造函数 - 没有虚基类
从 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 进行授权