Day 4
- 内联函数和 constexpr 函数声明和定义都在头文件中
封装的益处:
- 确保用户代码不会无意间破坏封装对象的状态。
- 被封装的类的具体实现细节可以随时改变,而不必调整用户级别的代码。
-
某些类不能依赖于默认的构造函数
- 只有当类没有声明任何构造函数,编译器才会生成默认构造函数。
- 如果累包含内置类型或者复合类型成员,只有已经明确了初始化值,才有可能保证不会出错(否则未初始化值会出错)
- 类中包含其他没有默认构造函数的类,编译器不能为其合成默认构造函数。
-
friend
友元函数声明后可以访问类的非公有成员,可以在类开始或结束集中声明。 -
mutable
声明的数据成员即使在 const 对象中也可以被修改。 -
#pragma once
文件只会被包含一次 -
基于 const 的重载。
Screen& display(std::ostream& os)
{ do_display(os); return *this; }
const Screen& display(std::ostream& os) const
{ do_display(os); return *this; }
private:
void do_display(std::ostream &os) const { os << contents; }
- 并不会增加函数开销,内部定义(隐式内联)。
-
类 A 将类 B 的成员函数 f() 声明为友元函数,需要将 f() 提前声明(B在A之前进行类声明,如果B需要用到A可以先前向声明类A,但是用到 A 的成员函数还不知道怎么做)
-
编译器处理完类中的全部生命后才会处理成员函数的定义。
-
对于成员是 const、引用或者某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表来初始化。
- 初始化顺序与出现顺序一致。(和在构造函数中的初始出现顺序无关)
-
explicit
关键字声明的单参数构造函数和多参数的构造函数不能用于隐式转换,只能够直接初始化。- string 类型接受单参数构造函数,如
string s = "abc"
这实际是一个单参数隐式转换构造函数。
- string 类型接受单参数构造函数,如