posts - 13, comments - 4, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Exceptional C++ Style 读书笔记(二)

Posted on 2008-11-05 23:59 Batiliu 阅读(548) 评论(0)  编辑 收藏 引用 所属分类: 读书笔记

第十四条 对象初始化顺序

当创建一个类类型的C++对象时,其初始化顺序是?

  下面这组规则是递归描述的:

  1. 最上层派生类的构造函数负责调用虚基类子对象的构造函数。所有虚基类子对象会按照深度优先、从左到右的顺序进行初始化。
  2. 直接基类子对象按照它们在类定义中声明的顺序被一一构造起来。
  3. (非静态)成员子对象按照它们在类定义体中声明的顺序被一一构造起来。
  4. 最上层派生类的构造函数体被执行。

 

准则避免过度使用继承。

 

第十五条 访问权限

准则永远不要对语言搞破坏。例如,永远不要企图通过复制类定义再添加友元声明,或提供成员模板函数特化等途径来破坏封装性。

 

第十六条 私有

  • private成员的名字只对其所属类的其他成员或友元来说是可访问的,而这里的其他成员也包括成员模板的任何显示特化。不过如果某段代码具有对某个成员的访问权,该段代码就可以通过泄漏该成员的指针方式将其访问权限授予外界的任何代码。
  • private成员对于任何能够看到其所属类定义的代码来说都是可见的。这意味着它的函数参数的类型必须事先声明,另外它还会参与名字查找和重载决议,因而可能会使调用变得无效或具有二义性。

 

第十七条 封装

准则总是将所有数据成员放在私有区段。唯一的列外是C风格的struct,后者的意图并不在于封装什么东西,因而其所有成员都是可以公用的。

准则接口是最需要在第一时间做对的事情。其他东西都可以在后期进行修正。如果你一开始就没有把接口做对的话,那么以后你可能就永远没有机会去改正它了。

 

第十八条 虚拟

准则尽量让接口成为非虚的。

准则尽量让虚函数置为私有的。

准则只有当派生类需要调用基类中实现的虚函数的时候,我们才需要将后者设为保护的。

准则基类的析构函数要么应当为公用虚函数,要么应当为保护的非虚函数。

 

第十九条 对派生类施加规则

准则

  • 永远不要让异常从析构函数中跑出来。
  • 永远不要为函数编写异常规格声明。

准则避免将赋值操作符设为虚函数。

准则尽量用编译期错误来取代运行时错误。

为了阻止编译器为派生类隐式生成默认构造函数、复制构造函数或者复制复制操作符,最简单的、最佳的选择是将基类中相应的函数“藏”在非公用区段(或者干脆让它消失,例如默认构造函数)。

 

第二十条 第二十一条 内存中的容器

内存管理的层次:

每种容器都会选择不同的空间/性能平衡点。效率方面,使用vector和set可以做到O(logN)时间复杂度的搜索;使用vector做到随机的元素访问;使用list来高效地地插入元素等等。

 

第二十二条 第二十三条 new操作

C++标准中提供了哪三种形式的new?

// 标准提供的operator new重载
 
// 最常用的简单new,用法:new T
void* ::operator new(std::size_t size) throw(std::bad_alloc);
 
// nothrow new,用法:new (std::nothrow) T
void* ::operator new(std::size_t size, const std::nothrow_t&) throw();
 
// 定位new,用法:new (ptr) T
void* ::operator new(std::size_t size, void* ptr) throw();

准则

如果你提供了任何类相关的new,那么:

  • 应该总是同时提供类相关的简单new。
  • 应该总是同时提供类相关的定位new。
  • 应该考虑也提供类相关的nothrow new;否则它就会被其他的类相关new隐藏了。

准则避免使用nothrow new。

准则无论如何,检查new是否失败通常都没多大意义。

 

第二十四条 常量

准则避免按const值传递对象。尽量按const引用传递。

 

第二十五条 内联

准则避免写inline或试图进行其他优化,除非性能测试显示有此必要。

准则记住,内联可能发生在任何时候。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理