![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective C++ Note
文章平均质量分 71
scofieldzhu
这个作者很懒,什么都没留下…
展开
-
条款54:让自己熟悉包括TR1在内的标准程序库
条款54:让自己熟悉包括TR1在内的标准程序库 Familiarize yourself with the standard library,including TR1. 本款原书主要介绍了标准程序库和TR1程序库.书里面介绍的很详细,我在这里就不想再次累赘介绍了,有兴趣的可以阅读原书的内容.我只把原书中关于本款要记住的要点帖出来: 请记住: ■ C++标准程序原创 2009-10-28 14:14:00 · 766 阅读 · 0 评论 -
条款29:为"异常安全"而努力是值得的
条款29:为"异常安全"而努力是值得的 (Strive for exception-safe code.) 内容: 看了这款的内容,我对C++的难以控制的"脾气"又有了进一步的了解,C++的安全性问题一直是广大非C++程序员所抨击C++语言"恶行"的主要方面,我们今天讨论的其"异常安全性"也是其复杂之处之一,看完这一款之后,你也许会发觉你以前写的代码可能会给最终产品带来多大的"风原创 2009-07-02 17:01:00 · 710 阅读 · 0 评论 -
条款28:避免返回handles指向对象内部成分
条款28:避免返回handles指向对象内部成分 (Avoid returning "handles" to object internals.)内容: 这里所谓的handles一般包括内部对象的references、pointer、iterator,这条款是如何产生的呢?理由是什么呢?我先不必急着回答你这些问题,我们先来看一个例子,假设我们的程序中要用到矩形,于是我们写了Rect原创 2009-07-01 16:11:00 · 721 阅读 · 0 评论 -
条款45:运用成员函数模板接受所有兼容类型
条款44:运用成员函数模板接受所有兼容类型(Use member function templates to accept "all compatible types.")内容: 不知道大家注意到没有,在类的继承体系中,对象指针一直在为我们做一件很好的事情:支持隐式转换(implicit conversions).Derived class指针可以隐式转换为base class指针,"指原创 2009-09-03 10:31:00 · 862 阅读 · 0 评论 -
条款44:将与参数无关的代码抽离templates
条款44:将与参数无关的代码抽离templates(Factor parameter-independent code out of templates.)内容: 自从我们进入模板编程的第一天,我们就意识到template不仅大大地减少了代码的执行时间,而且能够避免代码潜在的重复.我们不在需要为20个相似的classes而每一个都带有15个成员函数编写独立的一份代码去分别实现,我们只需原创 2009-08-31 11:27:00 · 975 阅读 · 0 评论 -
条款43:学习处理模板化基类内的名称
条款43:学习处理模板化基类内的名称(Know how to access names in templatized base classes.)内容: 现在我们接到一个编码任务,任务要求我们的目标程序能够传送信息到不同的公司去.这里的信息可以分为:被译成密码的信息和未经加工信息明文信息.我们分析了任务以后认为,在目标程序的编译期间我们就可以决定哪一个信息传送至哪一家公司.所以我们采用原创 2009-08-30 15:16:00 · 838 阅读 · 0 评论 -
条款27:尽量少做转型动作
条款27:尽量少做转型动作 (Minimize casting.) 内容: 我们先来看一下转型语法,C风格的转型语法大概就是下面这种形式: (T)expression //将expression转换为T类型 函数转型语法如下: T(expression) ////将expression转换为T类型 这两种转型语法,我们称之为"旧式转型",既原创 2009-06-26 11:25:00 · 830 阅读 · 0 评论 -
条款26:尽可能延后变量定义式的出现时间
条款26:尽可能延后变量定义式的出现时间 (Postpone variable definitions as long as possible.)内容: 由于定义一个类变量时,你就必须承担起构造和析构的负担.所以我们要尽量减少定义一些我们不用的对象,估计你现在对这条约束很不在意,我不用它为啥要定义它,我定义对象变量后肯定我会用它的嘛,呵呵,话不要说的太早有些时候,你的"不留心"会"原创 2009-06-25 09:49:00 · 970 阅读 · 1 评论 -
条款25:考虑写出一个不抛异常的swap函数
条款25:考虑写出一个不抛异常的swap函数(Consider support for a non-throwing swap.)内容: swap函数就是相互交换两个对象的内容,标准程序库中已经提供了该函数的实现版本,其实现过程也是那么的如你预期所愿: namespace std{ template void swap(T& a,T& b)原创 2009-06-24 14:59:00 · 1286 阅读 · 3 评论 -
条款24:若所有参数皆需类型转换,请为此采用non-member函数
条款24:若所有参数皆需类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters.)内容: 平时在我们的coding过程当中,我们有时候会碰到这样一些情况:我传进去的实参与声明函数的形参并不是同一类型的,函数调用竟然能够成功!这个听起来很原创 2009-06-24 08:30:00 · 901 阅读 · 2 评论 -
条款23:宁以non-member,non-friend替换member函数[?????????]
由于在本款中作者提出的观点及阐述过程我看了好几遍也没明白它的这个观点的理由,我个人觉得作者好像没有阐述清楚这两种对外接口的主要区别在哪里,我又请教了我们部门的高手,他也对这款的观点不是很赞同,所以说关于这款的内容阐述我也不打算写下来.网上的一网友对这款的一个概括描述语句我觉得还是很不错的: class设计时应该从OO上考虑是否应该将某些函数作为成员函数。那些并不归属于该类的函数不原创 2009-06-19 11:14:00 · 698 阅读 · 0 评论 -
条款42:了解typename的双重意义
条款42:了解typename的双重意义 Understand the two meanings of typename.内容: 看下面template声明式中,class与typename有什么不同? template class Widget;//use "class " template class Widget;//use "typename" 某些原创 2009-08-25 10:47:00 · 671 阅读 · 0 评论 -
条款22:将成员变量声明为private
条款22:将成员变量声明为private (Declare data members private.)内容: 首先我们讨论一下成员变量声明为public的情况,我们先从语法一致性角度来分析,如果成员变量不是public,那么客户访问这些变量唯一的方法只能是通过访问成员函数,由于这个时候public接口内只有函数,我们的客户就不需要在打算访问class成员时迷惑地试着记住是原创 2009-06-19 09:52:00 · 1459 阅读 · 2 评论 -
条款30:透彻了解inlining的里里外外
条款30:透彻了解inlining的里里外外 (Understand the ins and outs of inlining.)内容: 对于该款的描述,原文中用了6页的篇幅进行阐述,这里我就将重要的知识点罗列出来,方便大家更好的理解这一条款. (1)inline函数的优缺点. 优点:对于一个inline函数,你可以调用它们又不蒙受函数调用招致的额外开销,编译器就会对函原创 2009-07-03 10:31:00 · 939 阅读 · 0 评论 -
条款31:将文件间的编译依存关系降至最低
条款31:将文件间的编译依存关系降至最低 (Minimize compilation dependencies between files.)内容: 在你们的开发团队中,一些有经验的工程师时不时地会教导新手一些基本的编程原则,其中"将接口从实现中分离"可能是他(她)要你必须牢记原则,因为C++并没有把它做的很好,这只能靠我们在平时的编写代码中注意这一点了,如果你不小心违背了这一原则原创 2009-07-06 11:39:00 · 1201 阅读 · 1 评论 -
条款50:了解new和delete的合理替换时机
条款50:了解new和delete的合理替换时机 Understand when it makes sense to replace new and delete. 怎么会有人想要替换编译器提供的operator new或operator delete呢?我们可以列出如下三个常见的理由: ■ 用来检测运用上的错误. 程序员从开始编写代码到调试直至最终完成,这原创 2009-10-27 10:39:00 · 900 阅读 · 0 评论 -
条款53:不要轻忽编译器的警告
条款53:不要轻忽编译器的警告 Pay attention to compiler warnings. 许多程序员习惯性地忽略编译器警告.他们任务如果是问题真的很严重的话,编译器就应该给一个错误提示信息而不是警告信息.这种想法看起来似乎很合理,但是在C++语言上,我觉得编译器作者对代码即将会爆发的事情应该比你有更加深入的理解,你说呢?下面我举的这个例子是多多少少在大部人身上都发生过原创 2009-10-28 14:00:00 · 735 阅读 · 0 评论 -
条款52:写了placement new也要写placement delete
条款52:写了placement new也要写placement delete Write placement delete if you write placement new. 我们都知道当你在写一个new表达式像这样: Widget* new_widget = new Widget; 共有两个函数被调用:一个是用以分配内存的operator new,一个是Widg原创 2009-10-28 11:12:00 · 2293 阅读 · 0 评论 -
条款51:编写new和delete时需固守常规
条款51:编写new和delete时需固守常规 Adhere to convention when writing new and delete. 大家好,前一条款我们已经讨论了你在什么时候想要写个自定义的operator new和operator delete,但并没有解释当你这么做时必须遵守什么规则.我先来总体说一下,然后再分析这些规则. 要实现一致性operator原创 2009-10-27 15:39:00 · 964 阅读 · 0 评论 -
条款55(最一款):让自己熟悉Boost
条款55(最一款):让自己熟悉Boost Familiarize yourself with Boost. 本款是本书的最后一款,主要介绍了Boost库.书里面介绍的很详细,我在这里就不想再次累赘介绍了,有兴趣的可以阅读原书的内容.我只把原书中关于本款要记住的要点帖出来. 请记住: ■ Boost是一个社群,也是一个网站.致力于免费、源码开发、同僚复审的C++程原创 2009-10-28 14:21:00 · 872 阅读 · 1 评论 -
条款49:了解new-handler的行为
条款49:了解new-handler的行为 Understand the behavior of the new-handler. 在我们平时的编写代码过程中,总是避免不了去new出一些对象出来.我们知道new操作符私底下通过调用operator new来实现内存分配的.当operator new抛出异常以反映一个未获满足的内存需求之前,它会调用一个客户指定的错误处理函原创 2009-10-26 16:04:00 · 839 阅读 · 0 评论 -
条款47:请使用traits classes表现类型信息(2)
条款47:请使用traits classes表现类型信息(2) Use traits classes for information about types. 大家好,上一篇我们讨论了如何设计和实现traits classes,本篇将继续前面讨论来讲述如何使用traits classes来表现类型信息.好,我们现在有了iterator_traits,我们可以可以这样来实现advan原创 2009-10-22 20:52:00 · 890 阅读 · 0 评论 -
条款47:请使用traits classes表现类型信息(1)
条款47:请使用traits classes表现类型信息(1) Use traits classes for information about types. 今天我们讨论的这款内容涉及到一个STL实现上的一个关键技术traits技术,简单的说就是类的型别判定技术.由于本条款要讨论内容比较多,所以我将分成两篇文章来表述,今天我们只讨论traits classes的实现,明天我将讨论原创 2009-10-22 16:29:00 · 779 阅读 · 0 评论 -
条款48:认识template元编程
条款48:认识template元编程 Be aware of template metaprogramming. Template metaprogramming(TMPS,模板元编程)是编写template-based C++程序并执行编译期的过程.它本质上是以C++写成、执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若干C++源转载 2009-10-23 11:11:00 · 1105 阅读 · 0 评论 -
条款46:需要类型转换时请为模板定义非成员函数
条款46:需要类型转换时请为模板定义非成员函数 Define non-member functions inside templates when type conversion are desired. 还记得在条款24中,我们提到只有non-member函数才有能力在所有实参身上实施隐式类型转换.今天我们讨论的东西与该条款相关,如果现在的你恰好忘记了前面这条款的内容,那原创 2009-10-21 21:09:00 · 998 阅读 · 0 评论 -
条款34:区分接口继承和实现继承
条款34:区分接口继承和实现继承 Differentiate between inheritance of interface and inheritance of implementation 内容: 当你开始设计你的class时候,有时候你希望它的Derived class只继承它的原创 2009-07-15 13:43:00 · 770 阅读 · 0 评论 -
条款32:确定你的public继承塑模出is-a关系
条款32:确定你的public继承塑模出is-a关系 (Make sure public inheritance model is "is-a".)内容: 我想对于类之间的public继承关系,每一本C++语言教程都会花费不少的篇幅去阐述,而本款所说的内容也许你早已是耳熟能详了,但在实际编码涉及中你是否从本条款出发去认真地考虑过你的设计的合理性呢?我觉得大多数的人没有真正做到这一点原创 2009-07-07 10:20:00 · 851 阅读 · 0 评论 -
条款21:必须返回对象时,别妄想返回其reference
条款21:必须返回对象时,别妄想返回其reference (Dont try to return a reference when you must return an object.)内容: 前面一款我们提到了pass-by-value方式参数传递的效率带来的一系列可能引发的问题,你可能对pass-by-reference-const的参数传递方式特别的青睐,而现在我们需要原创 2009-06-18 10:16:00 · 808 阅读 · 0 评论 -
条款40:明智而谨慎地使用多重继承
条款40:明智而谨慎地使用多重继承 Use multiple inheritance judiciously.内容: 当我们提到多重继承(multiple inheritance:MI)时,就不得不面对当前C++的两个基本阵营:一个认为单一继承SI(single inheritance) 是好的,MI一定更好!令一个阵营认为,SI是好的,但MI不值得我们去频繁使用.本款我们就带领大家来原创 2009-08-21 11:26:00 · 901 阅读 · 0 评论 -
条款04:确定对象被使用前已先被初始化
条款04:确定对象被使用前已先被初始化(Make sure that objects are initialized before theyre used)内容: 在C++语言中,读取未初始化的值会导致不明确的行为,在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以原创 2009-06-04 09:54:00 · 713 阅读 · 0 评论 -
条款07:为多态基类声明virtual析构函数
条款07:为多态基类声明virtual析构函数 (Declare destructors virtual in polymorphic base classes.) 内容: 一看到这个条款,你可能立刻就会提出你的疑问来推翻这个结论:如果不为多态基类声明virtual析构函数,会发生什么灾难?好,其实答案是:当delete掉一个指向子类对象的基类指针时,它的行为是不可定义的----原创 2009-06-05 16:06:00 · 684 阅读 · 0 评论 -
条款06:若不想使用编译器自动生成的函数,就该明确拒绝.
条款06:若不想使用编译器自动生成的函数,就该明确拒绝.(Explicitly disallow the use of compiler-generated functionsyou do not want)内容: 在条款05中,我们弄清楚了编译器为我们自动生成的函数,而在现实中,我们有时并不需要编译器为我们提供某些函数的实现,因为它们的出现会导致我们现实中的某些最基本的常识变的不合理,原创 2009-06-05 10:23:00 · 672 阅读 · 0 评论 -
条款05:了解C++默默编写并调用哪些函数
条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls).内容: 有人提出了一个问题:如果我写了一个空类,里面什么都没有,什么功能都没有实现,这样的类合法么?我能用它么?比如: class Null{}; 也许你也有相同的问题,而我的答案是----->当然合法,你完全可以像一般类一样用它.原创 2009-06-04 16:02:00 · 867 阅读 · 1 评论 -
条款03:尽可能使用const
条款03:尽可能使用const(Use const whenever possible)内容: const关键字可以允许你指定一个对象是不能被改变的,而编译器能为你执行这个语义的约束,来确保代码中试图修改该对象的代码不能编译通过,以前我很少用const关键词,觉得用不用都可以,对它了解的很少,但随着写代码的增多,我越来越觉得const关键词很实用,很多地方用它可以达到一些意想不到的好处.原创 2009-06-03 11:00:00 · 761 阅读 · 1 评论 -
条款01:视C++为一个语言联邦
条款01:视C++为一个语言联邦(View C++ as a federation of languages)内容: 今天的C++已经是个多重范形编程语言(multiparadigm programming language),一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、原创 2009-06-02 14:40:00 · 1226 阅读 · 1 评论 -
条款02:尽量以const,enum,inline替换#define
条款02:尽量以const,enum,inline替换#define(prefer const,enum,inline to #define)内容: 比如你写下如下常量定义:#define MAX_BUFFER_LEN (50) 假如编译代码的时候由于MAX_BUFFER_LEN导致的编译错误时,编译的信息里面也许会提到50这个数字而不是MAX_BUFFER_LEN,因为MAX_BU原创 2009-06-02 15:24:00 · 626 阅读 · 1 评论 -
条款38:通过复合塑膜出has-a或"根据某物实现"
条款38:通过复合塑膜出has-a或"根据某物实现"内容: 所谓的复合就是类型之间的一种关系,它的基本的表现形式在我们平时的编写代码过程当中常常出现,比如你准备设计一个类的时候,你写出来的类的对象不是保护了其它的对象?呵呵,对了,这就叫复合.举个例子: class Address{...}; class PhoneNumber{...}; class P原创 2009-08-06 21:55:00 · 901 阅读 · 0 评论 -
学习之前的开篇语
>(third edition),提到这本书,说心里话,我心理老觉得对不其她了,她闲居在我电脑硬盘上那么长的时间,我都没有抽出点时间好好地去阅读她,没有用心去跟她交流.最近一段时间我们老大休假了,我们也闲了下来,呵呵,工作当中真正属于自己的时间是不多(我相信大多数人都有这样的感觉),我赶紧乘这段时间去好好看看她,弥补一下内心的愧疚之情.在这之前我就听说她世界闻名,大明星,每个看过她的人都被她的美所原创 2009-06-02 14:07:00 · 744 阅读 · 2 评论 -
条款37:绝不重新定义继承而来的缺省参数值
条款37:绝不重新定义继承而来的缺省参数值内容: 审视了一下条款以后,我们可以换一种说法:绝不重新定义继承而来的virtual函数或non-virtual函数的缺省参数值.而在上一款中我们提到,绝对不要试图去重新定义继承而来的non-virtual函数,将这句话与本条款合并的话,我们就可以将本条款的内容简化为:绝不重新定义继承而来的virtual函数的缺省参数值.为什么继承而来的vir原创 2009-08-04 15:22:00 · 2237 阅读 · 3 评论 -
条款36:绝对不要重新定义继承而来的non-virtual函数
条款36:绝对不要重新定义继承而来的non-virtual函数内容: 我们来看个例子,class B为基类,class D为public继承自B的子类: class B{ public: void func(){...} }; class D:public B{...} 接下来我们面对以下行为: D dObject;原创 2009-08-03 08:35:00 · 1003 阅读 · 2 评论