洛译小筑

别来无恙,我的老友…
随笔 - 45, 文章 - 0, 评论 - 172, 引用 - 0
数据加载中……

Effective C++

[ECPP读书笔记 条目39] 审慎使用私有继承
     摘要: ·私有继承意味着“A以B的形式实现”。通常它的优先级要低于组合,但是当派生类需要访问基类中受保护的成员,或者需要重定义派生的虚函数时,私有继承还是有其存在的合理性的。
·与组合不同,私有继承可以启用“空基类优化”特性。对于类库开发人员而言,私有继承对于降低对象尺寸来说至关重要。  阅读全文

posted @ 2012-10-12 23:39 ★ROY★ 阅读(1986) | 评论 (0)  编辑

[ECPP读书笔记 条目38] 使用组合来表示“A包含B”、“A以B的形式实现”
     摘要: 组合与公共继承之间存在着本质区别。
组合在应用域意味着“A是B”,在实现域意味着“A以B的形式实现”。  阅读全文

posted @ 2012-07-08 16:18 ★ROY★ 阅读(1949) | 评论 (2)  编辑

[ECPP读书笔记 条目37] 避免对函数中继承得来的默认参数值进行重定义
     摘要: 避免在对函数中继承得来的默认参数值进行重定义,这是因为默认参数值是静态绑定的,而虚函数是动态绑定的。  阅读全文

posted @ 2012-05-20 11:21 ★ROY★ 阅读(2094) | 评论 (0)  编辑

[ECPP读书笔记 条目36] 避免对派生的非虚函数进行重定义
     摘要: 避免对派生的非虚函数进行重定义  阅读全文

posted @ 2011-12-30 22:53 ★ROY★ 阅读(2254) | 评论 (1)  编辑

[ECPP读书笔记 条目35] 虚函数的替代方案
     摘要: 在你为当前的问题设计解决方案时,不妨考虑一下虚函数以外的其他替代方案。  阅读全文

posted @ 2011-12-25 00:59 ★ROY★ 阅读(3209) | 评论 (2)  编辑

[ECPP读书笔记 条目34] 区分清接口继承和实现继承
     摘要: 接口继承与实现继承存在着不同。在公共继承体系下,派生类总是继承基类的接口。
纯虚函数要求派生类仅继承接口。
简单(非纯)虚函数要求派生类在继承接口的同时继承默认的实现。
非虚函数要求派生类继承接口和强制内容的实现。
  阅读全文

posted @ 2008-07-06 22:58 ★ROY★ 阅读(2569) | 评论 (3)  编辑

[ECPP读书笔记 条目33] 避免隐藏继承而来的名字
     摘要: 祝劳动者节日快乐!
派生类中的名字会将基类中的名字隐藏起来。在公有继承体系下,这是我们所不希望见到的。
为了让被隐藏名字再次可见,可以使用using声明或者转发函数。
  阅读全文

posted @ 2008-05-01 01:11 ★ROY★ 阅读(2684) | 评论 (2)  编辑

[ECPP读书笔记 条目32] 确保公共继承以“A是一个B”形式进行
     摘要: 公共继承意味着“A是一个B”的关系。对于基类成立的一切都应该适用于派生类,因为派生类的对象就是一个基类对象。  阅读全文

posted @ 2008-03-17 22:55 ★ROY★ 阅读(2049) | 评论 (2)  编辑

[ECPP读书笔记 条目31] 尽量减少文件间的编译依赖
     摘要: 最小化编译依赖的基本理念就是使用声明依赖代替定义依赖。基于这一理念有两种实现方式,它们是:句柄类和接口类。
库头文件必须以完整、并且仅存在声明的形式出现。无论是否涉及模板。
  阅读全文

posted @ 2008-01-01 01:37 ★ROY★ 阅读(2119) | 评论 (7)  编辑

[ECPP读书笔记 条目30] 深入探究内联函数
     摘要: 仅仅对小型的、调用频率高的程序进行内联。这将简化你的调试操作,为底层更新提供方便,降低潜在的代码膨胀发生的可能,并且可以让程序获得更高的速度。
不要将模板声明为inline的,因为它们一般在头文件中出现。

  阅读全文

posted @ 2007-11-18 23:27 ★ROY★ 阅读(1580) | 评论 (1)  编辑

[ECPP读书笔记 条目29] 力求代码做到“异常安全”
     摘要: 异常安全的函数即使在异常抛出时,也不会带来资源泄露,同时也不允许数据结构遭到破坏。这类函数提供基本的、增强的、零异常的三个层面的异常安全保证。
增强保证可以通过复制并交换策略来实现,但是增强保证并不是对所有函数都适用。
函数所提供的异常安全保证通常不要强于其调用的函数中保证层次最弱的一个。
  阅读全文

posted @ 2007-10-04 21:53 ★ROY★ 阅读(1456) | 评论 (5)  编辑

[ECPP读书笔记 条目28] 不要返回指向对象内部部件的“句柄”
     摘要: 避免返回指向对象内部部件的句柄(引用、指针或迭代器)。这样做可以增强封装性,帮助const成员函数拥有更加“const”的行为,并且使“野句柄”出现的几率降至最低。  阅读全文

posted @ 2007-09-23 23:25 ★ROY★ 阅读(1143) | 评论 (2)  编辑

[ECPP读书笔记 条目27] 尽量少用转型操作
     摘要: 尽可能避免使用转型,尤其是在对性能敏感的代码中不要使用动态转型dynamic_cast。如果一个设计方案需要使用转型,要尝试寻求一条不需要转型的方案来取代。
在必须使用转型时,要尝试将其隐藏在一个函数中。这样客户端程序员就可以调用这些函数,而不是在他们自己的代码中使用转型。
要尽量使用C++风格的转型,避免使用怀旧风格的转型。现代的转型更易读,而且功能更为具体化。
  阅读全文

posted @ 2007-09-13 22:27 ★ROY★ 阅读(1326) | 评论 (3)  编辑

[ECPP读书笔记 条目26] 定义变量的时机越晚越好
     摘要: 定义变量的时机越晚越好。这可以提高程序的清晰度和工作效率。
  阅读全文

posted @ 2007-08-19 22:00 ★ROY★ 阅读(1158) | 评论 (0)  编辑

[ECPP读书笔记 条目25] 最好不要让swap抛出异常
     摘要: swap是一个非常有趣的程序。它最早是作为STL的一部分引入C++的,而后就成为了异常安全编程的主体内容,另外对于可以自赋值的对象而言它还是一个常用的复制处理机制。由于swap如此神通广大,那么以一个恰当的方式去实现它就显得十分重要了,但是它的举足轻重的地位也决定了实现它并不是一件手到擒来的事情。在本小节中,我们就会针对swap函数展开探索,逐步掌握如何去驾驭它。

  阅读全文

posted @ 2007-08-02 22:05 ★ROY★ 阅读(1402) | 评论 (3)  编辑

[ECPP读书笔记 条目24] 当函数所有的参数需要进行类型转换时,要将其声明为非成员函数
     摘要: 如果你需要对一个函数的所有参数进行类型转换,那么它必须是一个非成员函数。  阅读全文

posted @ 2007-07-05 23:23 ★ROY★ 阅读(1215) | 评论 (1)  编辑

[ECPP读书笔记 条目23] 多用非成员非友元函数,少用成员函数
     摘要: 在特性情况下要更趋向于使用非成员非友元函数,而不是成员函数。这样做可以增强封装性,以及包装的灵活性和功能扩展性。
  阅读全文

posted @ 2007-06-11 22:27 ★ROY★ 阅读(1157) | 评论 (0)  编辑

[ECPP读书笔记 条目22] 将数据成员声明为私有的
     摘要: 要将数据成员声明为私有的。这样可以让客户端访问数据时拥有一致的语义,提供有条不紊的访问控制,强制类符合一致性,为类作者提供更高的灵活性。
protected并不会带来比public更高的封装性。
  阅读全文

posted @ 2007-06-06 18:37 ★ROY★ 阅读(998) | 评论 (0)  编辑

[ECPP读书笔记 条目21] 在必须返回一个对象时,不要去尝试返回一个引用
     摘要: 不要返回一个指向局部的、分配于栈上的对象;不要返回一个引用去指向分配于堆上的对象;不要返回一个指向局部静态对象的指针或引用。
  阅读全文

posted @ 2007-06-02 21:13 ★ROY★ 阅读(1275) | 评论 (2)  编辑

[ECPP读书笔记 条目20] 传参时要多用“引用常量”,少用传值
     摘要: 尽量使用引用常量传参,而不是传值方式。因为传引用更高效,而且可以避免“截断问题”。
对于内建数据类型、STL迭代和函数对象类型,通常传值方式更实用。
  阅读全文

posted @ 2007-06-01 18:12 ★ROY★ 阅读(1418) | 评论 (3)  编辑

[ECPP读书笔记 条目19] 要像设计类型一样设计class
     摘要: class设计就是类型的设计。在定义一个新的类型之前,要确保将本条目中所有的问题考虑周全。  阅读全文

posted @ 2007-05-20 23:30 ★ROY★ 阅读(908) | 评论 (2)  编辑

[ECPP读书笔记 条目18] 要让接口易于正确使用,而不易被误用
     摘要: 优秀的接口应该易于正确使用,而不易误用。对所有的接口都应该力争做到这一点。
保持与内置数据类型有一致的行为,是使接口易于正确使用的一种可行的方法
防止错误发生的方法有:创建新的数据类型,严格限定类型的操作,约束对象的值,不要将管理资源的任务留给客户端程序员。
tr1::shared_ptr支持自定义的删除功能。这可以防止“跨DLL问题”,可以应用与自动解开互斥锁等情况。
  阅读全文

posted @ 2007-05-18 23:30 ★ROY★ 阅读(854) | 评论 (0)  编辑

[ECPP读书笔记 条目17] 用智能指针存储由new创建的对象时要使用独立的语句
     摘要: 在单独的语句中使用智能指针来保存由new创建的对象。如果不这样做,你的程序会在抛出异常时发生资源泄漏。
  阅读全文

posted @ 2007-05-15 23:12 ★ROY★ 阅读(1491) | 评论 (89)  编辑

[ECPP读书笔记 条目16] 互相关联的new和delete要使用同样的形式
     摘要: 如果你在一个new语句中使用了[],那么你必须要在相关的delete语句中使用[]。如果你在new语句中没有使用[],那么在相关的delete语句中一定不要出现[]。
  阅读全文

posted @ 2007-05-14 22:15 ★ROY★ 阅读(1088) | 评论 (0)  编辑

[ECPP读书笔记 条目15] 要为资源管理类提供对原始资源的访问权
     摘要: API通常需要访问原始资源,因此每个RAII类都应该提供一个途径来获取它所管理的资源。
访问可以通过显式转换或隐式转换来实现。一般情况下,显式转换更安全,但是隐式转换对于客户端程序员来说使用更方便。
  阅读全文

posted @ 2007-05-13 20:54 ★ROY★ 阅读(800) | 评论 (0)  编辑

[ECPP读书笔记 条目14] 要注意资源管理类中的复制行为
     摘要: 复制一个RAII对象的同时也要复制其所管理的对象,所以资源管理的复制行为由RAII对象的复制行为决定。
一般的RAII类在复制时应遵循两条原则:不允许使用复制,要进行资源计数。
  阅读全文

posted @ 2007-05-11 18:40 ★ROY★ 阅读(930) | 评论 (1)  编辑

[ECPP读书笔记 条目13] 使用对象来管理资源
     摘要: 为了避免资源泄漏,可以使用RAII对象,使用构造函数获取资源,析构函数释放资源。
auto_ptr或TR1::shared_ptr是两个常用并且实用的RAII类。通常情况下TR1::shared_ptr是更好的选择,因为它的复制行为更加直观。复制一个auto_ptr将会使其重设为null。
  阅读全文

posted @ 2007-05-07 18:52 ★ROY★ 阅读(980) | 评论 (0)  编辑

[ECPP读书笔记 条目12] 要复制整个对象,不要遗漏任一部分
     摘要: 要确保拷贝函数拷贝对象的所有的数据成员,及其基类的所有部分,不要有遗漏。
不要尝试去实现一个拷贝函数来供其它的拷贝函数调用。取而代之的是,把公共部分放入一个“第三方函数”中共所有拷贝函数调用。
  阅读全文

posted @ 2007-05-03 21:15 ★ROY★ 阅读(866) | 评论 (1)  编辑

[ECPP读书笔记 条目11] 在operator=中要考虑到自赋值问题
     摘要: 劳动者万岁!
在一个对象为自己赋值时,要确保operator=可以正常地运行。可以使用的技术有:比较源对象和目标对象的地址、谨慎安排语句、以及“复制并交换”。
在两个或两个以上的对象完全一样时,要确保对于这些重复对象的操作可以正常运行。
  阅读全文

posted @ 2007-04-30 18:38 ★ROY★ 阅读(1170) | 评论 (1)  编辑

[ECPP读书笔记 条目10] 让赋值运算符返回一个指向*this的引用
     摘要: 让赋值运算符返回一个指向*this的引用。
  阅读全文

posted @ 2007-04-28 20:35 ★ROY★ 阅读(1047) | 评论 (4)  编辑

[ECPP读书笔记 条目9] 永远不要在构造或析构的过程中调用虚函数
     摘要: 在程序进行构造或析构期间,你绝不能调用虚函数,这是因为这样的调用并不会按你所期望的执行,即使能够顺利执行,你也不会觉得十分舒服。
  阅读全文

posted @ 2007-04-27 22:37 ★ROY★ 阅读(1496) | 评论 (4)  编辑

[ECPP读书笔记 条目8] 防止因异常中止析构函数
     摘要: 永远不要让析构函数引发异常。如果析构函数所调用的函数会抛出异常的话,那么在析构函数中要捕捉到所有异常,然后忽略它们或者终止程序。
在一次操作中,如果一个类的使用者有能力对抛出异常作出反应,那么这个类应该提供一个常规的函数(而不是析构函数)来进行这一操作。
  阅读全文

posted @ 2007-04-22 14:00 ★ROY★ 阅读(1411) | 评论 (3)  编辑

[ECPP读书笔记 条目7] 要将多态基类的析构函数声明为虚函数
     摘要: 应该为多态基类声明虚析构函数。一旦一个类包含虚函数,它就应该包含一个虚析构函数。
如果一个类不用作基类或者不需具有多态性,便不应该为它声明虚析构函数。
  阅读全文

posted @ 2007-04-20 21:59 ★ROY★ 阅读(1338) | 评论 (2)  编辑

[ECPP读书笔记 条目6] 要显式禁止编译器为你生成不必要的函数
     摘要: 为了禁用编译器自动提供的功能,你必须将相关的成员函数声明为private的,同时不要实现它。方法之一是:使用一个类似于Uncopyable的基类。
  阅读全文

posted @ 2007-04-18 23:21 ★ROY★ 阅读(1035) | 评论 (1)  编辑

[ECPP读书笔记 条目5] 要清楚C++在后台为你书写和调用了什么函数
     摘要: 编译器可能会隐式为一个类生成默认构造函数、复制构造函数、拷贝赋值运算符和析构函数。
  阅读全文

posted @ 2007-04-17 19:34 ★ROY★ 阅读(1068) | 评论 (1)  编辑

[ECPP读书笔记 条目4] 确保对象在使用前得到初始化
     摘要: 为了避免在对象初始化之前使用它,你仅仅需要做三件事。第一,手动初始化基本类型的非成员对象。第二,使用成员初始化表来初始化对象的每一部分。最后,初始化次序的不确定性会使定义于不同置换单元中的非局部静态对象之间产生冲突,要避免这样的设计。
  阅读全文

posted @ 2007-04-15 20:23 ★ROY★ 阅读(1583) | 评论 (4)  编辑

[ECPP读书笔记 条目3] 尽可能使用const
     摘要: const是一个令人赞叹的东西。对于指针和迭代器,以及对于指针、迭代器和引用所涉及的对象,对于函数的参数和返回值,对于局部变量,以及对于成员函数来说,const都是一个强大的伙伴。尽可能去利用它。你一定不会后悔。
  阅读全文

posted @ 2007-04-11 19:55 ★ROY★ 阅读(1417) | 评论 (3)  编辑

[ECPP读书笔记 条目2] 多用const、enum、inline,少用#define
     摘要: 对于简单的常量,应多用const对象或枚举类型数据,少用#define。
对于类似程序的宏,应多用内联函数,少用#define。  阅读全文

posted @ 2007-04-04 21:58 ★ROY★ 阅读(2213) | 评论 (0)  编辑

[ECPP读书笔记 条目1] 把C++看作多种语言的联合体
     摘要: 无论你有怎样的编程背景,都需要用一些时间和精力来适应C++。 C++是一门强大的编程语言,它拥有数不尽的实用功能,但是在你能够熟练地驾御C++的力量,并且恰当而高效地利用这些功能之前,首先你要适应C++做事情的方式。这本书自始至终都是在介绍如何顺利地完成这一适应过程,但是相比较大多数议题而言,还有一些更为基础的内容,本章向大家介绍的就是这些更为基础的东西。  阅读全文

posted @ 2007-04-02 21:12 ★ROY★ 阅读(2287) | 评论 (6)  编辑