effective C++ 3nd

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

1. C

用于C的基本特性。

2. 面向对象

封装、继承、多态、动态绑定、虚函数表

3. 泛型编程

模板函数、模板类。这一部分也是大部分人接触最少的。(参考模板模式)

4. STL 库

高效的使用C++完成算法功能。


条款2:尽量以const、enum、inline替换#define

1. 单纯的常量,使用const、enum 替代#define

2. 函数计算宏,用inline替代#define

以上两点都是基于#define的不灵活性,以及编译器不对#define进行类型检查的原因导致的。


条款3:尽可能使用const

1. 让编译器帮助检查,同时避免出乎意料的错误

函数参数、返回值、内部变量


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

因为C++不一定保证初始化变量,手动初始化可以避免出乎意料的错误。


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

编译器默认构建了:缺省构造函数、缺省赋值构造函数、缺省复制构造函数,以及默认析构函数。


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

好吧,这一点我没什么好说的,使用private就行。


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

确保在多态的时候,父类引用指向子类对象的时候,析构函数可以通过vptr正确的释放资源。


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

1. 在析构函数中,不抛出异常,而吞下异常(进行处理或者终止程序)

2. 尽量把需要析构的资源可能抛出异常的,放到一个普通函数中,供用户调用。

否则容器中的类将可能无法正常释放。


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

多态时,构造和析构的过程中,虚函数的vptr指针指向当前类,而非实际子类。


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

返回引用,以确保正确的链式赋值


条款11:在operator=中实现“自我赋值”

主要涉及到对内存的理解,在自我赋值的时候,不要delete了对应的内存。


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

抽取共同代码,而否包含调用关系。分清深浅拷贝,避免析构时的错误。


条款13:以对象管理资源

典型的应用就是智能指针了,条款13主要用于保证资源在析构函数中正确的被释放。


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

结合上一条款理解,主要保证正确的使用资源。如采用:引用计数,深拷贝,资源转移等手段。


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

确保类的封装不会导致对资源访问的限制。


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

这没什么好说的。


条款17:以独立语句将newed对象置入智能指针

C++11 对智能指针进行了内置,但仍然建议使用该策略。


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

一致性,见名知意,良好的类型检查避免误用。


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

这一条涉及到了延展性,类图谱性。目前,不能有深刻的体会。


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

用于函数的原则,避免使用复制构造函数的调用,类的重复构建以及销毁。但是STL是值传递的形式(深拷贝,避免互相影响)。


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

本条款主要用于考虑栈空间的局部性(堆中没有该问题)。


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

良好的封装性,访问的一致性(通过函数)。


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

通过non-member、non-friend的函数的操作,避免了不必要的对于private成员的错误访问,体现更好的封装性。


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

本条款主要考虑C++支持的隐式转换问题。实用性是否较弱?


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


条款26:尽可能延后变量定义式的出现时间

避免不必要的变量定义占用资源,同时也将清晰思路。


条款27:尽量少做转型动作

1. const_cast : 移除常量性
2. dynamic_cast : 向下转型
3. reinterpret_cast : 不同类型间的转换(如指针和非指针)
4. static_cast : 执行任意的隐式转换和相反转换
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)

条款28:避免返回handles指向对象内部成分

增加封装性


条款29:为“异常安全”而努力是值得的

避免处理异常的时候,资源或者数据遭到破坏。


条款30:透彻了解inlining的里里外外

不存在循环,少量判断,无函数指针,直接复制,小型,类型检查。


条款31:将文件间的编译依存关系降至最低

解耦。


条款32:确定你的public继承塑模出is-a关系

现在的OOP的使用应该更强调has-a的关系,但是当你确定框架结构的时候,需要明确is-a的关系建立。


条款33:避免遮掩继承而来的名称

C++11 提供了override关键字,但是子类无法和父类重载,所以当父类定义多个重载函数时,子类覆盖一个,则覆盖全部。


条款34:区分接口继承和实现继承

1. 纯虚函数
2. 虚函数
3. 非虚函数

条款35:考虑virtual函数以外的其他选择

本条款主要讨论策略模式,这里没有过多研究。


条款36:绝不重新定义继承而来的non-virtual函数

结合条款33,避免对于父类同名函数的覆盖

条款37:绝不要重新定义继承而来的缺省参数值

因为缺省参数值是静态绑定的。所以你重新定义的话,父类引用还是无法使用子类对象相应的值。


条款38:通过复合塑模树has-a 或“根据某物实现出”

松耦合的设计思想。


条款39:明智而审慎的使用private继承

就是基本别用的意思


条款40:明智而审慎的使用多重继承

会引起歧义,除非你是使用多继承实现接口。


条款41:了解隐式接口和编译期多态

认识template


条款42:了解typename的双重意义


条款43:学习处理模板化基类内的名称


条款44:将与参数无关的代码抽离templates

尽可能的降低templates二次编译所生成的代码数量。


条款45:运用成员函数模板接受所有兼容类型


条款46:需要类型转换时请为模板定义非成员函数


条款47:请使用traits class表现类型信息


条款48:认识template元编程

执行于编译期


条款49:了解new-handler的行为


条款50:了解new和delete的合理替换时机


条款51:编写new和delete时需固守常规

如若该操作可能失败,故最好加入判断。


条款52:写了placement new也要写placement delete

一一对应


条款53:不要轻忽编译器的警告


条款54:让自己熟悉包括TR1在内的标准程序库

TR1是一份C++标准的文档,如目前的C++11,都是基于其发展的。本条约告诉我们关注C++的发展。


条款55:让自己熟悉Boost

一个强大的第三方扩展库,对C++的新标准的推动性。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 2,758评论 0 13
  • 1.C和C++的区别?C++的特性?面向对象编程的好处? 答:c++在c的基础上增添类,C是一个结构化语言,它的重...
    杰伦哎呦哎呦阅读 9,421评论 0 45
  • PART0、前言 TOPIC运用c++进行高效编程 收获了解c++如何行为为什么那样行为如何运用其行为形成优势 P...
    rh_Jameson阅读 3,456评论 2 30
  • 尽量用const和inline而不用#define尽量用编译器而不用预处理。 尽量用 而不用 scanf和prin...
    mikey219阅读 777评论 0 1
  • 1、这是一颗柠檬,长的很像核桃,但它确实是柠檬。只想知道,它到底经历了什么?2、昨晚半夜醒来,就睡不着了。最近在看...
    疯芝麻阅读 88评论 0 0