类的成员函数
- 声明在类内部;定义可以在类内部,也可以在类外部。当类的成员函数定义在类外部时,类外部定义的成员的名字必须包含他所属的类名。
- 定义在类内部的函数是隐式的 inline(内联)函数。
- this:隐式定义的常量指针。
类的接口的非成员函数
- 声明在类外部,和类同属一个 .h 头文件。
- 定义在 .cpp 文件中。
访问说明符
- public:
- 其中成员在整个程序内可被访问。
- 负责定义类的接口。
- private:
- 其中成员只能被类的成员函数访问。不能被使用该类的代码访问。
- 封装了类的实现细节。
class 与 struct 区别:默认访问权限
- class:private
- struct:public
友元 friend
- 类允许该类的非成员函数、其他类或其他类的成员函数访问他的非公有成员,方法是另其他类或函数成为它的友元。
- 在类的开始或结束位置,集中声明友元。
- 友元关系不存在传递性。每个类负责控制自己的友元类或友元函数。
可变数据成员 mutable
- 即使在 const 成员函数中,也可以修改类的某个数据成员。
名字查找
- 一般的名字查找
- 首先,在名字所在块中寻找声明,只考虑在名字使用之前出现的声明。
- 若没找到,继续查找外层作用域。
- 若没找到,则报错。
- 类的名字查找:编译器处理完类中的全部声明后才会处理成员函数的定义。
- 首先,编译成员声明;
- 知道类全部可见后才编译函数体。
构造函数
- 使用构造函数初始值列表:在很多类中,初始化和赋值区别事关底层效率:前者直接初始化数据成员;后者先初始化再赋值。
- 委托构造函数:一个委托构造函数使用它所属类的其他构造函数执行他自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。
- 转换构造函数:如果构造函数只接受一个参数,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称为转换构造函数。
- 关键字 explicit :
- 用于阻止构造函数定义的隐式转换。
- 只对一个实参的构造函数有效。
- 只能在类内声明构造函数时使用。
- explicit构造函数只能用于直接初始化。
类的静态成员 static
- 类的静态对象存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。类中只存在一个静态数据成员,被所有类的对象所共享。
- 静态成员函数不与任何对象绑定,他们也不包含this指针。
动态绑定
C++中的动态绑定(Dynamic Binding)是指在运行时根据对象的实际类型来决定调用哪个函数的机制,也称为运行时多态(Runtime Polymorphism)。动态绑定允许在派生类和基类之间进行多态调用,使得程序能够根据对象的实际类型来选择调用不同的成员函数。 (1) 使用基类的引用(或指针)调用虚函数时发生。 (2) 既可以使用基类对象,又可以使用派生类对象。
3. 访问控制与继承
(1) 派生类对基类的访问控制权限: (I) public:可以访问公有成员。 (II) private:不能访问私有成员。 (III) protected:基类希望派生类访问,禁止其他用户访问。