《Effective C++》读书笔记

条款01:视C++为一个语言联邦

  • C++高效编程守则视状况而变化,取决于你使用C++的哪一部分(C, Obejct-Oriented C++, Template C++, STL)。

条款02:尽量以const, enum, inline替换#define

  • 对于单纯常量,最好以const对象或enum替换#define。
  • 对于形似函数的宏,最好改用inline函数代替#define。

条款03:尽可能使用const

  • 将某些东西声明为const可帮助编译器检测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回值类型、成员函数本体。
  • 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”。
  • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

条款04:确定对象被使用前已先被初始化

  • 为内置类型进行手工初始化,因为C++不保证初始化它们。
  • 构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作。初始化列表列出的成员变量,其排列次序应该和它们在类中的声明次序相同。
  • 为免除“跨编译单元的初始化次序”问题,请以local static对象替换non-local static对象。

条款05:了解C++默默编写并调用哪些函数

  • 编译器可以暗自为类创建默认构造函数、拷贝构造函数、拷贝赋值操作符,以及析构函数。

条款06:若不想使用编译器自动生成的函数,就该明确拒绝。

  • 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。

条款07:为多态基类声明virtual析构函数

  • 带多态性质的基类应该声明一个virtual析构函数。如果类带有任何virtual函数,它就应该拥有一个virtual析构函数。
  • 类的设计目的如果不是作为基类使用,或不是为了具备多态性,就不该声明virtual析构函数。

条款08:别让异常逃离析构函数

  • 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们或结束程序。
  • 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

条款09:绝不在构造和析构过程中调用virtual函数

在构造和析构期间不要调用virtual函数,因为这类调用从不下降至派生类。

条款10:令operator=返回一个reference to *this

令赋值操作符返回一个reference to *this。

条款11:在operator=中处理“自我赋值”

  • 确保当对象自我赋值时operator=有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。
  • 确定任何函数如果操作一个以上的对象,而其中多个对象时同一个对象时,其行为仍然正确。

条款12:复制对象时勿忘其每一个成分

  • Copying函数应该确保复制“对象内的所有成员变量”及“所有的base class”成分。
  • 不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用。

条款13:以对象管理资源

  • 为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
  • 两个常被使用的RAII classes分别时shared_ptr和auto_ptr。前者通常是较佳选择,因为其拷贝行为比较直观。若选择auto_ptr,拷贝动作会使它指向null。

条款14:在资源管理类中小心拷贝行为

  • 复制RAII对象必须一并复制它所管理的资源,所以资源的拷贝行为决定RAII对象的拷贝行为。
  • 普遍而常见的RAII类的拷贝行为是:抑制拷贝、施行引用计数法。

条款15:在资源管理类中提供对原始资源的访问

  • APIs往往要求访问原始资源,所以每一个RAII类应该提供一个“取得其所管理之资源”的办法。
  • 对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。

条款16:成对使用new和delete时要采取相同形式

  • 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

条款17:以独立语句将new出来的对象置入智能指针

  • 以独立语句将new出来的对象置入智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

条款18:让接口容易被正确使用,不易被误用

  • 好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。
  • “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
  • “阻止使用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
  • shared_ptr支持定制型删除器。这可防范DLL问题,可被用来自动接触互斥锁等。

条款19:设计class犹如设计type

  • Class的设计就是type的设计。在定义一个新type之前,请确定你已经考虑如下问题:

    • 新type的对象应该如何被创建和销毁?
    • 对象的初始化和对象的赋值该有什么样的差别?
    • 新type的对象如果被passed by value,意味着什么?
    • 什么是新type的“合法值”?
    • 你的新type需要配合某个继承图系吗?
    • 你的新type需要什么样的转换?
    • 什么样的操作符和函数对此新type而言是合理的?
    • 什么样的标准函数应该驳回?
    • 谁该取用新type的成员?
    • 什么是新type的“未声明接口”?
    • 你的新type有多么一般化?
    • 你真的需要一个新type吗?

条款20:尽量以pass-by-reference-to-const替换pass-by-value

  • 尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题。
  • 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。

条款21:必须返回对象时,别妄想返回其reference

  • 绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。

条款22:将成员变量声明为private

  • 切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并提供class作者以充分的实现弹性。
  • protected并不比public更具封装性。

条款23:尽量以non-member、non-friend替换member函数

  • 尽量以non-member non-friend函数替换member函数。这样做可以增加封装性、包裹弹性和机能扩充性。

条款24:若所有参数皆需类型转换,请为此采用non-member函数

  • 如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

条款25:考虑写出一个不抛异常的swap函数

  • 当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常。
  • 如果你提供一个member swap,也该提供一个non-member swap用来调用前者。对于classes(而非templates),也请特化std::swap。
  • 调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰”。
  • 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。

《Effective C++》读书笔记(一)相关推荐

  1. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  2. MongoDB权威指南读书笔记——CRUD

    插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...

  3. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  4. HTML5权威指南----读书笔记

    <!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...

  5. 计算机网络和http权威指南 读书笔记

    计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...

  6. MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)

    文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...

  7. android开发读书笔记,android开发权威指南读书笔记

    第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...

  8. java性能权威指南中文_Java性能权威指南读书笔记--之一

    JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...

  9. javascript权威指南读书笔记之二——词法结构

    本章讲述的内容,用通俗的语言来说,就是应该注意的地方,这些也许和我们所学的其他语言类似,也许完全不同,比如一开始就介绍说javascript程序中的每个字符都是用两个字节表示的,但有些程序设计者习惯于 ...

  10. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...

最新文章

  1. java 启动参数_网红框架SpringBoot2.x之定制参数浅析(一)
  2. SAP MM 外部采购流程里的Advanced Return Management
  3. Delphi Form Designer (窗体设计器)之四
  4. 什么叫系统的可扩展性?
  5. ViewPage 一次滑动多页
  6. 电脑svchost进程占用内存
  7. Nagios设置报警间隔
  8. 如何上传html验证文件大小,html5 实现客户端验证上传文件的大小(简单实例)
  9. html5代码_干货篇!零基础学习HTML5要用到的6款开发工具
  10. 将JAVA编译为EXE的几种方法
  11. 如何把一个java工程打成一个jar包(转载)
  12. c语言求成绩标准差,C程序计算标准偏差
  13. HTML5 创建热点图
  14. matlab水蒸气焓值计算_焓变 反应热-化学选修4同步优质系列教案(人教版)
  15. Google 封杀我写的 Web 浏览器!
  16. 计算机核心期刊、学报一览
  17. Python中容易忽视的知识点
  18. 关于String s = new String(xyz); 创建几个对象的问题
  19. 微计算机原理及应用大纲,《微型计算机原理及应用》考试大纲
  20. mysql 水晶报表_Crystal Reports 2008(水晶报表) JDBC连接mysql数据库

热门文章

  1. 京东末位淘汰:为什么末位淘汰不适合用在软件研发团队?
  2. python基于pingouin包进行统计分析:使用mediation_analysis函数构建包含协变量的mediation analysis(中介分析)模型、covar参数指定协变量
  3. 众链网络-慧景区项目建设方案1(票务系统)
  4. 附代码 | OpenCV实现银行卡号识别,字符识别算法你知多少?
  5. 【支付架构】银联额度映射
  6. 尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】
  7. 阿里巴巴P6-P8成长笔记
  8. BZOJ P4808 马
  9. 红帽子linux开发工具,红帽发布 Red Hat Enterprise Linux 5 下载
  10. 群联MPALL(Rel) 7F V5.03.0A-DL07量产工具 PS2251-07(PS2307)