C++聚合类型

C++ 聚合类型

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

定义

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

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

从 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 起)
posted @ 2025-06-25 12:36  _Sylvan  阅读(67)  评论(0)    收藏  举报