现在的位置: 首页 > 综合 > 正文

Effective C++ 读书笔记(29-34):类与函数之实现

2012年10月28日 ⁄ 综合 ⁄ 共 1082字 ⁄ 字号 评论关闭

Item29 -- 避免传回内部数据的handles

传回handle之后,打破了抽象性,所以要避免
对于non-const member functions而言,传回内部handle也会导致麻烦,当涉及暂时对象,Handle可能变成悬空的(dangling)

Item30 -- 避免写出member function,传回一个non-const的指针或引用并指向较低存取层级的members

同条款30,指向底存取层级的members会破坏抽象性,如果非这样不可,也要加上const进行避免

Item31 -- 千万不要传"函数内local对象的引用"或"函数内以new获得的指针所指的对象"

这次是局部变量可能被析构的问题,主要针对暂时变量

Item32 -- 尽可能延缓变量定义式的出现

需要的时候再定义,延缓定义式的出现,当出错时就会减少内存的使用。

Item33 -- 明智地运用inline

1,好处:直接用代码替换,减少函数调用成本
2,坏处:造成代码膨胀现象,可能会导致病态的换页现象
3,大部分编译器会拒绝将复杂的(内有循环或递归调用)函数inline,而所有虚拟函数都不能inline
4,构造函数和析构函数最好不要inline,即使inline,编译器也会产生出out-of-line副本,以方便获取函数指针

Item34 -- 将文件之间的编译依赖关系降至最低

class Person{

private::
string name_;
Data birthDate_;
Address address_;
Country citizenship_;
}

为了编译Person,编译器必须知道Data/Address/Country等类占用大小,所以产生了编译依赖,使用make的时候,当任何一个内部类变化,使用Person的代码都会编译。如果客户只需要使用Person的公开接口,底层实现是由别人提供的,那么客户是不愿意每次在底层代码更新之后都要对自己的代码重新编译。

解决方法是使用指针,又称handle class

class string;
class Address;
class Country;
class PersonImpl;
class Person{
public:

string name() const;
string birthDate() const;
string address() const;
string nationality() const;
private:
PersonImpl * impl
}

或者定义接口,让Person成为特殊的抽象类,成为Protocol class,采用工厂方法,产生能够有具体实现的对象,类似于单键模式。

抱歉!评论已关闭.