###C++ Primer第5版 学习笔记
####第七章
- 类的成员函数通过顶层 const 指针 this 访问调用它的那个对象,任何对类成员的直接访问都被看做 this 的隐式引用,不得自定义名为 this 的参数或变量,可以在成员函数体内使用 this
- const 成员函数相当于将 this 定义为底层 const,这种函数叫常量成员函数
- 编译器处理类,先编译成员声明,然后才轮到成员函数体,因此成员函数体可以随意使用其他成员而无需考虑顺序
- 有些非成员函数,概念上属于类,但实际上不属于类本身,那么如果他们不是定义在类中,则一般应与类声明(而非定义)在同一个头文件内
- 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内
- 编译器创建的构造函数称为合成的默认构造函数
(synthesized default constructor)
- 类名() = default;//要求编译器生成构造函数,放在类内部则 inline,外部反之,如果同时还有有其他构造函数对所有形参赋予默认值,则在调用时会发生歧义
- 友元声明只能放在内的内部,通常把友元的声明与类本身放置在同一个头文件中
- 用来定义类型的成员
(typedef, using)
必须先定义后使用 - inline 成员函数应与类定义在同一个头文件中
mutable
声明总是可变的变量- C++11中,默认初始化的最好方式是把默认值声明成一个类内初始值({}或=)
- 由于常量成员函数返回 const 引用,因此很可能无法用在函数调用链中,解决办法是创建 const 和 非 const 的两个重载函数,调用同一个 const 函数执行动作(返回值可以为 void),但返回 const 和 非 const 引用
- 对不完全类型,只能用于定义指向该类型的指针或引用,和声明(但不能定义)以该类型为参数或返回值的函数
- 友元函数能定义在类内部,此时隐式内联
- 类和非成员函数的声明不是必须在他们的友元声明之前,但哪怕友元函数定义在了类内部,在其他函数使用该友元函数时,也需要之前有函数声明存在
- 应该使用构造函数初始值列表进行初始化,const 和 引用初始化的唯一机会就是通过构造函数初始值,初始化的顺序与其在类定义中出现的顺序相同,最好令两个顺序一致
- 委托构造函数
class Sales_date {
public:
Sales_date(string s, unsigned cnt,double price):
bookNo(s), units_sold(cnt), revenue(cnt*price) {}
Sales_date(): Sales_date("", 0, 0) {}//委托给了上一个构造函数,上一个构造函数执行完毕后执行本函数函数体
}
- 将构造函数声明为 explicit 阻止隐式类类型转换,该声明不应再类外部的函数定义处重复
- 类的静态成员函数没有 this 指针,因此也就不能为 const
- static 关键字不能重复,只能出现在类内部的声明语句
- 最好把静态数据成员的定义与其他非内联函数的定义放在同一个 .cc 文件中,以防重复定义
- 不建议在类内部初始化静态成员,如果在内部初始化了,通常也应该在类外部定义一下(但不能指定初始值)