C++ Primer 5 CH7 类

时间:2023-03-08 18:42:22

7.1 定义抽象数据类型

  • 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,定义可以在类的内部或外部。作为接口组成部分的非成员函数的声明和定义都在类的外部。
  • 定义在类内部的函数是隐式的 inline 函数。
  • 当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过 this 的隐式参数来访问调用它的那个对象。
  • 任何对类成员的直接访问都被看作 this 的隐式引用。
  • this 是一个常量指针,不允许改变 this 保存的地址。
  • 使用 const 的成员函数被称作常量成员函数,const 的作用是修改隐式 this 的指针类型,使它变成指向常量的指针,因此常量成员函数不能改变调用它的对象的值。
  • 编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以任意使用类中的其他成员而无序在意成员出现的次序。
  • 返回 this 对象:return *this
  • 如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件中。
  • 构造函数的名字和类名相同,没有返回类型,可以重载。
  • 构造函数不能声明为 const。
  • 只有当类没有声明任何构造函数时,编译器才会自动的生成默认的构造函数。
  • 默认构造函数:Sales_data() = default;
  • 构造函数初始值列表:
Sales_data(const std::string &s) : bookNo(s) {}
  • 当某个数据成员被构造函数初始值列表忽略时,它将以与合成默认构造函数相同的方式隐式初始化。

7.2 访问控制与封装

  • 使用访问说明符加强类的封装性。
  • public 定义类的接口,private 封装类的实现细节。
  • class 与 struct 的唯一区别是默认的访问权限。如果我们使用 struct,定义在第一个访问说明符之前的成员是 public 的,如果我们使用 class,定义在第一个访问说明符之前的成员是 private 的。
  • 类允许其他类或函数访问它的非公有成员,方法是令其他类或函数称为它的友元 friend。
  • 友元声明只能出现在类的内部,但是出现的具体位置不限。
  • 友元声明不是一个通常意义上的函数声明,因此需要在友元声明之外,专门对函数进行一次声明。

7.3 类的其他特性

  • 类型成员:定义某种类型在类中的别名,存在访问限制。
  • 用来定义类型的成员必须先定义后使用。
  • 可以在类的内部用 inline 声明内联函数,也可以在类的外部用 inline 修饰函数的定义,不需在声明和定义的地方同时说明 inline,最好在定义的地方说明 inline。
  • inline 成员函数应该与相应的类定义在同一个头文件中。
  • 可变数据成员:mutable 关键字,值可以改变,即使它是 const 对象的成员。
  • 一个 const 成员函数如果以引用的形式返回 *this,那么它的返回类型将是常量引用。
  • 每个类定义了唯一的类型,对于两个类,即使它们的成员函数完全一样,也是两个不同的类型。
  • 一旦一个类的名字出现后,它就被认为是声明过了,因此类允许包含指向它自身类型的引用或指针。
  • 类可以把其他类定义成友元,也可以把其他类(之前已经定义过)的成员函数定义成友元。
  • 友元关系不存在传递性。
  • 如果一个类想把一组重载函数声明成它的友元,它需要对这组函数中的每一个分别声明。
  • 友元本省不一定真的声明在当前作用域中,需要在类的外部提供声明使得函数可见。

7.4 类的作用域

7.5 构造函数再探

  • 如果没有在构造函数的初始值列表中显式地初始化成员,则该成员将在构造函数体之前执行默认初始化。
  • 如果成员是 const、引用或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化列表为这些成员提供初值。
  • 初始值列表不限定初始化的具体执行顺序,成员的初始化顺序与它们在类定义中的出现顺序一样。