标签:std 函数 effective -- 对象 swap 条款 type 04
东阳的学习记录
条款18:让接口容易被正确使用、不易被误用
- 接口设计要清晰无歧义,能让用户知晓每一个参数的含义以及使用目的、方法
- “促进正确使用” 的方法包括接口的一致性,以及与内置类型的行为兼容
- “阻止误用” 的方法有:
i 建立新类型、限制类型上的操作
ii 束缚对象值
iii 消除客户的资源管理责任 - shared_ptr 支持定制型删除器。这可防范DDL问题,可被用来自动解除互斥锁等等
条款19:设计 class 犹如设计 type
- 新 type 如何创建和销毁?
- 对象的初始化和复制有何区别?
- 新 type 对象如果被 pass-by-value, 意味着什么?
- 什么是 type 的合法值?
- 你的新 type 需要配合某个继承图系吗?
- 你的新 type 需要什么样的类型转换?
- 什么样的操作符和函数对于新 type 是合理的?
- 什么样的标准函数应该被驳回?(那正是你必须声明为 private 者)
- 谁该取用新 type 的成员?
- 新 type 有多么一般化?、
- 你真的需要一个新 type 吗?
条款20:以 const & 传递参数 代替 value
- 以 const & 传递可以回避构造析构成本。
- 以const & 传递参数可以防止对象被切割。若以值传递,将会使得派生类中属于派生类独有的那一部分被阉割
- 对于内置类型,STL的迭代器和函数对象使用值传递更加高效
条款21:必须返回对象时,不要妄想返回其引用
- 不要返回局部栈对象的引用,否则会造成空悬指针
- 返回堆对象的引用也是一个坏主意
记住:
永远不要返回局部对象的引用或指针, 永远不要返回堆对象的引用, 永远不要返回指针或引用指向一个 local static 对象而有可能同事需要多个这样的对象。
条款22:将成员变量声明为private
- 通过函数统一控制,能够实施精准的访问控制
- 方便以后更改代码以及维护
- 可用计算替代保存值,视实际情况选择
- 就封装性来说,protected与public一样
- 封装性与“当其内容改变时可能造成的代码破坏量成反比”
条款23:宁以 non-member、non-friend替换member函数
- 使用非成员函数,能降低编译依存度,带来更大的封装性
- 我们使用封装的原因,使我们的改变影响更少的人
- 非成员函数提供更大的封装性,因为其不可访问 private 成员
- 将不同功能置于多个头文件中
条款24:若所有参数皆需类型转换,请采用 non-member 函数
- 任何时候,能避免使用 friend 函数就应该避免
- 如果你需要对所有的参数(包括 this 所指的隐喻参数)进行类型转换,那么这个函数必须是非成员函数。
条款25:考虑写出一个不抛异常的swap函数
- 如果你希望你的软件有预期的效果,不要往std命名空间添加任何东西
记住:
- 当std::swap对你的类型效率不高时,提供一个swap成员函数并确保这个函数不抛异常
- 如果你提供了一个成员的swap,就应该提供一个 non-member swap 用来调用前者,对于class(而不是模板),请特化 std::swap
- 调用第二步中的swap时,使用using std::swap将 std空间中的swap添加到作用域中
- 为 “用户定义类型“ 进行 std templates 全特化是好的,但是千万不要在 std 中加入任何全新的东西
标签:std,函数,effective,--,对象,swap,条款,type,04 来源: https://blog.csdn.net/qq_22473333/article/details/112070929
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。