🥥聚合类和字面值常量类
2022-5-15
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

聚合类

聚合类(aggregate class)使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,是聚合的:
  • 所有成员都是 public
  • 没有定义任何构造函数
  • 没有类内初始值
  • 没有基类,也没有虚函数
 
下面的类是一个聚合类:
 
可以使用一个用花括号包围的成员初始值列表初始化聚合类的数据成员。初始值顺序必须与声明顺序一致。如果初始值列表中的元素个数少于类的成员个数,则靠后的成员被值初始化。
 
显式地初始化类的对象的成员存在三个明显的缺点:
  • 要求类的所有成员都是public
  • 将正确初始化每个对象的每个成员的重任交给了类的用户。用户很容易忘掉某个初始值,或者提供不恰当的初始值,所以这样的初始化过程冗长乏味且容易出错
  • 添加或删除一个成员之后,所有的初始化语句都需要更新
 
 

字面值常量类

constexpr函数的参数和返回值必须是字面值类型。除了算术类型、引用和指针外,某些类也是字面值类型。和其他类不同,字面值类型的类可能含有constexpr函数成员。这样的成员必须符合constexpr函数的所有要求,是隐式const的。
 
数据成员都是字面值类型的聚合类是字面值常量类。或者一个类不是聚合类,但符合下列条件,则也是字面值常量类:
  • 数据成员都是字面值类型
  • 类至少含有一个 constexpr 构造函数
  • 如果数据成员含有类内初始值,则内置类型成员的初始值必须是常量表达式。如果成员属于类类型,则初始值必须使用成员自己的 constexpr 构造函数
  • 类必须使用析构函数的默认定义
 
 
constexpr 构造函数
尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。事实上,一个字面值常量类必须至少提供一个constexpr构造函数。
constexpr构造函数可以声明成= default的形式,或者是删除函数的形式。否则,constexpr构造函数就必须既符合构造函数的要求(意味着不能包含返回语句),又符合constexpr函数的要求(意味着它能拥有的唯一可执行语句就是返回语句)。综合这两点可知,constexpr构造函数体一殷来说应该是空的。通过前置关键字constexpr就可以声明一个constexpr构造函数了:
 
constexpr 构造函数必须初始化所有数据成员,初始值使用 constexpr 构造函数或常量表达式。
constexpr 构造函数用于生成 constexpr 对象以及 constexpr 函数的参数或返回类型:
 
  • C++
  • 类的静态成员枚举类型
    目录