定义抽象数据类型
- const常量成员函数:不能改变调用它的对象内容
- 利用引用传递定义IO类函数:
- 默认构造函数:
如果没有定义构造函数,则编译器会隐式定义一个默认构造函数
如果定义了别的构造函数,仍然需要使用默认构造函数,则利用default显示定义:
定义在函数内部的成员函数自动是inline,在类外部可以用inline关键词修饰函数定义
- 构造函数初始值列表:
访问控制与封装
class默认访问权限:private
struct默认访问权限:public
- 友元:
类的其他特性
- 可变数据成员:
在const成员函数中,希望能修改类的某个成员数据,在变量的声明中加入mutable
- 类数据成员的初始值:
- const 函数重载:
- 类的声明:
类声明但未定义时,是个不完全类型,可以定义指针或引用,可以声明以该类型为参数或返回类型的函数
类为定义时,不能定义它的对象(无法了解存储空间)
类的成员类型不能是该类自己,可以是该类的引用或指针
- 类之间的友元关系:
友元声明并非函数声明
构造函数
- 构造函数初始值列表:
对于成员是引用,const,未提供默认构造函数的类类型,必须使用构造函数初始值列表
构造函数初始值列表进行初始化的顺序与类定义中的出现顺序一致,和列表中的前后位置无关
- 委托构造函数:
- 隐式的类类型转换:
需要多个实参的构造函数不能用于执行隐式转换
explicit 阻止构造函数定义的隐式转换:只需要在类内声明使用;只允许直接初始化
执行显示转换:
- 聚合类:
所有成员都是public
没有定义构造函数
没有类内初始值
没有基类,virtual函数
- 字面值常量类
聚合类是字面值常量类
要求:
数据成员都是字面值类型
至少有1个constexpr构造函数
如果一个数据成员有类内初始值,则初始值为一条常量表达式
如果有成员为某种类类型,则初始值必须使用constexpr构造函数
必须使用析构函数的默认定义
constexpr构造函数形式:
函数体为空,必须初始化所有数据成员
创建constexpr对象
静态成员
静态成员函数不能声明成const,也不能在static函数体内使用this指针
在类外部定义静态成员函数时,不需要使用static
通常情况,类的静态成员不应该在类的内部初始化
可以为静态成员提供const整数类型的类内初始值,要求静态成员必须是constexpr:
静态成员的类型可以是它所属的类类型