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

推荐订阅源

Y
Y Combinator Blog
有赞技术团队
有赞技术团队
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
IT之家
IT之家
MyScale Blog
MyScale Blog
博客园_首页
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
罗磊的独立博客

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