第七章 类
7.1 定义抽象数据类型
- 类的成员函数通过一个名为 this 的隐式形参来访问调用它的那个对象,在调用时,用请求该函数的对象地址初始化 this, this 是一个常量指针。要将 this 声明成指向常量的指针只需在函数的形参列表后加上 const。
- 定义在类内部的函数是隐式的 inline 函数。
- 类外部定义的成员名字必须包含其所属的类名,通过使用作用于运算符实现。
- 只有类,没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
7.2 访问控制与封装
- struct 和 class 的默认访问权限不一样,对于定义在第一个访问说明符之前的成员,使用 struct 关键字则是 public 的,使用 class 关键字则是 private 的。
2.友元的声明只是指定了访问权限,并不是一个通常意义上的函数声明。 - 友元不是类的成员,也不受它所在区域访问控制级别的约束。
7.3 类的其他特性
- mutable 成员永远不会是 const ,即使它是 const 对象的成员。
- 通过区分成员函数是否是 const ,可以对其进行重载。
- 即使两个类的成员列表完全一致,它们也是不同的两个类。
- 友元声明的作用仅仅是影响访问权限,在类的外部还是得声明。
- 对于一个类型,在它声明之后定义之前是一个不完全类型。可以定义指向这种类型的指针或引用或静态数据成员,可以声明以不完全类型作为参数或者返回类型的函数
7.4 类的作用域
- 在类中,成员如果使用了外层作用域中的某个名字(一种类型),那么类不能在之后重新定义该名字。
7.5 构造函数再探
- 如果类中国 一个成员由另一个成员初始化,那么两个成员的初始化顺序与声明的顺序相关。
- 如果想定义一个使用默认构造函数的对象,再定义的时候不能在对象名后加括号对,否则定义的只是一个不接受任何实参的函数。
- 能同通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。但是类类型转换只被允许一次。
- 通过将构造函数声明为 explicit 使构造函数只能用于直接初始化。该关键字只对一个实参的构造函数有效,这不是废话嘛,需要多个实参的构造函数并不能执行隐式转换。该关键词也只能在类内定义。
5.通过强制类型转换 static_cast 可以强行把一个实参转换为显式的对象。
7.6 类的静态成员
- 静态成员存在于任何对象之外,也被任何该类型的对象共享。
- 在类的外部定义静态成员时,不能重复 static 关键字。
- 如果在类的内部对静态成员提供初始值了,在定义的时候就不能再指定一个初始值了。
- 可以为静态成员提供 const 整数类型的类内初始值,要求静态成员必须是字面值常量类型的 constexpr。