18. Make interfaces easy to use correctly and hard to use incorrrectly.
总结:
第一,好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。
第二,“促使正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
第三,“阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
第四,tr1::shared_ptr支持定制型删除器(custom deleter)。这可防范DLL问题,可被用来自动解除互斥锁等等。
19.Treat class design as type design.
1)新type的对象应该如何被创建和销毁?
2)对象的初始化和对象的赋值有什么样的差别?
3)新type的对象如果被passed by value(以值传递),意味着什么?
4)什么是新type的“合法值”?
5)你的新type需要配合某个继承图系(inheritance graph)吗?
6)你的新type需要什么样的转换?
7)什么样的操作符和函数对此新type而言是合理的?
8)什么样的标准函数应该驳回?
9)谁该取用新type的成员?
10)什么是新type的“未声明接口”(undeclared interface)?
11)你的新type有多么一般化?
12)你真的需要一个新type吗?
总结:
Class的设计就是type的设计。在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题。
20.Prefer pass-by-reference-to-const to pass-by-value.
总结:
第一,尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题(slicing problem)。
第二,以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。
21.Don't try to return a reference when you must return an object.
总结:
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。条款4已经为“在单线程环境中合理返回reference指向一个local static对象”提供了一份设计实例。
22.Declare data members private.
总结:
第一,切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并提供class作者以充分的实现弹性。
第二,protected并不比public更具封装性。
23.Prefer non-member non-friend functions to member functions.
总结:
宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和技能扩充性。
24.Declare non-member functions when type conversions should apply to all parameters.
总结:
如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.
25.Consider support for a non-throwing swap.
总结:
第一,当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常。
第二,如果你提供一个member swap,也该提供一个non-member swap用来调用前者。对于classes(而非templates),也请特化std::swap。
第三,调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰”。
第四,为“用户定义类型”进行std templates全特化是最好的,但是千万不要尝试在std内加入某些对std而言全新的东西。
感悟:这部分主要是介绍设计的时候需要注意的一些原则,总体来说都是在设计类的时候很容易遇见的问题。只是最后一个条款,关于swap的内容,平时用的很少。需要在用到的时候,重新再仔细看下这部分的内容。

转载于:https://www.cnblogs.com/ainima/archive/2013/05/21/6331974.html

Effective C++ 读书笔记之Part4.Design and Declarations相关推荐

  1. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  2. more effective c++和effective c++读书笔记

    转载自http://bellgrade.blog.163.com/blog/static/83155959200863113228254/,方便日后自己查阅, More Effective C++读书 ...

  3. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  4. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  5. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  6. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  7. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  8. Effective C++ 读书笔记 Item1-Item4

    目录 守则01:把C++看做一个语言的集合,而不是单一的语言 守则02:尽量使用const, enum, inline, 减少宏变量#define的使用 守则03: 尽可能使用const关键字 守则0 ...

  9. Effective C++读书笔记(一)

    百度博客本来就垃圾,我以前发表的文章也全是废品.就在csdn这里放上我的读书笔记,自娱自乐下. 1 让自己习惯C++ 条款01:视C++为一个语言联邦 C语言同时支持过程形式(procedural). ...

最新文章

  1. 算法模板——二分图匹配
  2. jquery 设置checkbox的checked属性 总是出问题
  3. “LM/w3svc/1/root /***” 别名已存在
  4. 漫画|你还记得原生的JDBC怎么连接数据库吗?
  5. SAP CRM WebClient UI ON_NEW_FOCUS的用途
  6. python生成元组_python 列表生成、元组、字典
  7. SOA (面向服务的架构)
  8. linux启动脚本卡住,linux 服务脚本启动问题
  9. ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 2、安装WebAdapter
  10. 读取遥感图像中遇到的问题集锦
  11. TortoiseGit 分支管理策略
  12. ACM 学习笔记(四) 数据结构之列表、数组、栈、队列
  13. Android中R文件的丢失问题以及aapt.exe停止工作如何解决
  14. 关于NXP公司的IMX6系列芯片参考资料体系介绍
  15. OPPO R7C刷机包下载_OPPO r7c原厂固件包下载地址
  16. 管理计算机的浏览器怎么删,怎样卸载ie?高手教你怎么卸载ie浏览器Internet Explorer...
  17. 数据库表,excel,cvs 联系人转vcf
  18. 视频号怎么添加商品带货扩展链接规则
  19. 官网下载VMware Workstation Player 16、15、14
  20. 【快鸽支付】个人免签支付_个人二维码支付_个人固码收款_个人支付接口_个人支付宝收款_个人微信收款_个人QQ支付收款

热门文章

  1. Redis 源码分析之故障转移
  2. vs2017 js cordova + dotnet core 开发app
  3. laravel中Blade模板继承
  4. React学习(8)—— 高阶应用:不使用ES6、JSX实现React
  5. 【leetcode】Remove Duplicates from Sorted Array
  6. condition_variable的怪事
  7. UI控件篇——UIPageControl及其自定义
  8. 下一版本的Android OS ——Jelly Bean
  9. VS code前端配置
  10. 一加到1亿。C语言_一加官方道歉!这下良心了:老用户欢呼