- 让接口容易被正确使用,不容易被误用
- 设计一个新的class要考虑的问题:
2.1 新type如何被创建和销毁——构造函数和析构函数以及内存分配函数和释放函数
2.2 对象的初始化和赋值该有什么样的差别——构造函数和赋值运算符
2.3 对象如果被以值传递会发生什么——拷贝构造函数
2.4 什么是新type的合法值
2.5 新type需要配合某个继承图系吗?
2.6 新type需要什么样的转换吗?
2.7 什么样的操作符和函数对此type是合理的
2.8 什么样的标准函数应该驳回——声明为private
2.9 谁该取用新type的成员
2.10 什么是新type的未声明接口
2.11 新type有多么一般化 - 用const引用代替以值传递
3.1 提高效率,避免了很多拷贝构造函数的使用
3.2 按引用传递可以避免对象切割问题,只有引用和指针才有多态
3.3 对于内置类型和STL的迭代器和函数对象,按值传递效率更高 - 将成员变量声明为private。从封装的角度看,只有两种访问权限:private和其他。protected并不比public更具有封装性
- 愈少代码可以看到数据,愈多的数据可以被封装,所以一个non-member non-friend 函数比member函数有更大的封装性
- 将所有便利函数放在多个头文件内但隶属同一个命名空间,意味着客户可以轻松扩展这一组便利函数,只需要添加更多non-member non-friend函数到此命名空间内
- 如果需要为所有参数进行类型转换,那么这个函数必须是non-member
- 可以避免friend就该避免
- C++只允许对class template偏特化,在function template上偏特化是行不通的
- 当std::swap对新type效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常
10.1 如果提供一个member swap,也应该提供一个non-member swap来调用前者。对于classes(而非templates),需要特化std::swap
10.2 调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命令空间资格修饰”
10.3 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西 - 全特化和偏特化待补充……
Effective C++笔记 —— 第四章
最新推荐文章于 2021-07-13 23:05:01 发布