惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
D
DataBreaches.Net
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
腾讯CDC
博客园_首页
The Cloudflare Blog
S
SegmentFault 最新的问题
C
Check Point Blog
美团技术团队
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale

博客园 - liuchen

我回来了 《全景探秘游戏设计艺术》读后感之引子 长连接和短连接 这不科学 —— 读《死亡之旅》 windows 64位 luajava编译 Effective C++ 读书笔记(45-50):杂项讨论 Effective C++ 读书笔记(35-44):继承关系与面向对象设计 Effective C++ 读书笔记(18-28):类与函数之设计和声明 Effective C++ 读书笔记(11-17):构造析构和赋值函数 - liuchen Effective C++ 读书笔记(5-10):内存管理 Effective C++ 读书笔记(0-4) - liuchen 读《msyql完全手册》之三:管理与开发 读《msyql完全手册》之二:数据库使用 读《msyql完全手册》之一:介绍和安装 js中的定时器 php中readdir关于时间路径排序的代码 linux 配置服务器 Windows下配置SVN (Subversion) 转载 该适当的总结了
Effective C++ 读书笔记(29-34):类与函数之实现
liuchen · 2009-10-19 · via 博客园 - liuchen

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,采用工厂方法,产生能够有具体实现的对象,类似于单键模式。