随笔分类 -  Effective/More Effective C++ 读书笔记

摘要:(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发 阅读全文
posted @ 2015-10-14 21:48 Reasno 阅读(377) 评论(0) 推荐(0) 编辑
摘要:1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有 阅读全文
posted @ 2015-10-14 21:15 Reasno 阅读(346) 评论(0) 推荐(0) 编辑
摘要:1. 假如程序有一个Chicken class,Lizard class,Animal class,其中Chicken class和Lizard class继承自Animal class,整个继承体系像这样: Animal负责具体化所有东吴的共同特征,Lizard和Chicken是需要特殊对待的两种 阅读全文
posted @ 2015-10-13 22:09 Reasno 阅读(574) 评论(0) 推荐(0) 编辑
摘要:1. 所谓"在未来时态下发展程序",指的是是程序需要具有良好的可扩展性和可维护性,它要求程序:功能齐全,接口易用,代码泛化,以下原则有助于实现这一目标: 1). 以C++本身表现各种规范而不是仅仅依赖于注释:如果某个class不打算作为基类,那么就应该以C++语法阻止派生(条款26);如果一个cla 阅读全文
posted @ 2015-10-13 20:48 Reasno 阅读(367) 评论(0) 推荐(0) 编辑
摘要:1. 假设要编写一个发生在太空的游戏,其中有飞船(spaceship),太空站(space station)和小行星(ssteroid),使它们继承自一个抽象基类GameObject,整个继承体系像这样: class GameObject { ... }; class SpaceShip: publ 阅读全文
posted @ 2015-10-13 01:04 Reasno 阅读(524) 评论(0) 推荐(0) 编辑
摘要:1. 所谓代理类(proxy class),指的是"它的每一个对象都是为了其他对象而存在的,就像是其他对象的代理人一般".某些情况下用代理类取代某些内置类型可以实现独特的功能,因为可以为代理类定义成员函数而但却无法对内置类型定义操作.条款5就展示了一个使用代理类阻止隐式类型转换的例子. 2. 实现二 阅读全文
posted @ 2015-10-09 14:47 Reasno 阅读(1018) 评论(0) 推荐(0) 编辑
摘要:1. reference counting使得多个等值对象可以共享同一实值,这样不仅简化了heap objects的簿记工作,便于管理内存,而且能够节省空间,提升效率.以下讨论以自实现的String为例. 2. Reference Counting(引用计数)的实现 基本设计像这样: class S 阅读全文
posted @ 2015-10-07 18:55 Reasno 阅读(719) 评论(0) 推荐(0) 编辑
摘要:1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造, 阅读全文
posted @ 2015-10-06 22:31 Reasno 阅读(759) 评论(0) 推荐(0) 编辑
摘要:1. 要求对象产生于堆中 由于non-heap 对象会在定义时自动构造,并在寿命结束时自动析构,因此要阻止客户产生non-heap对象,只需要将构造或析构函数声明为private.又由于构造函数可能有多个,儿媳够函数只有一个,因此更好的选择是将析构函数声明为private,然后开放一接口调用它,像这 阅读全文
posted @ 2015-10-06 12:23 Reasno 阅读(415) 评论(0) 推荐(0) 编辑
摘要:1. 针对某些有特殊功能的类,有时需要限制其对象数量,例如系统中只有一个打印机,因此需要将打印机的对象数目限制为1,或者只有16个file descriptor(文件描述器)可用,因此必须确定不会有更多的descriptor objects被产生出来,在这些情况下.就需要限制对象数目,或者说阻止对象 阅读全文
posted @ 2015-10-06 01:00 Reasno 阅读(478) 评论(0) 推荐(0) 编辑
摘要:1. Virtual constructor 原则上构造函数不能为虚:虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体,但构造函数用于构造对象,在对象构造之前自然没有动态类型的概念,虚与非虚也就无从谈起.所谓的的virtual-constructor实际上是 阅读全文
posted @ 2015-09-26 22:04 Reasno 阅读(343) 评论(0) 推荐(0) 编辑
摘要:1. 要实现C++的每一个语言特性,不同的编译器可能采取不同的方法,其中某些特性(如标题所列)的实现可能会对对象的大小和其member functions的执行速度带来冲击. 2. 虚函数. 当通过对象指针或引用调用虚函数时,具体调用哪一个虚函数由指针或引用的动态类型决定,大部分编译器使用vtbls 阅读全文
posted @ 2015-09-26 12:59 Reasno 阅读(504) 评论(0) 推荐(0) 编辑
摘要:1. "理想的程序库应该小,快速,威力强大,富有弹性,有扩展性,直观,可广泛运用,有良好支持,使用时没有束缚,而且没有'臭虫'".但实际上这种程序库是不可能实现的:要针对速度和大小做优化,往往要牺牲移植性;要有丰富的机能,结果可能不够直观......一个程序库往往要权衡各方面得失,采取折中的方法来实 阅读全文
posted @ 2015-09-25 23:41 Reasno 阅读(201) 评论(0) 推荐(0) 编辑
摘要:1. 一般来说,重载了算数操作符(以下称"独身形式"),那么也就要重载复合赋值操作符(以下称"复合形式").要确保操作符的复合形式例如(operator+=)和独身形式(例如operator+)行为相一致,基于前者实现后者是一个好方法.例如: class Rational{ public: Rati 阅读全文
posted @ 2015-09-25 20:31 Reasno 阅读(383) 评论(0) 推荐(0) 编辑
摘要:1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换. 2. 阅读全文
posted @ 2015-09-24 21:40 Reasno 阅读(370) 评论(0) 推荐(0) 编辑
摘要:1. 函数如果返回对象,就会产生临时对象(见条款19)的构造,析构等过程,考虑以下重载的operator*: class Rational{ public: int getNumerator(){return numerator;} int getDenomerator(){return denom 阅读全文
posted @ 2015-09-24 21:01 Reasno 阅读(598) 评论(0) 推荐(0) 编辑
摘要:1. 所谓的C++临时对象并不是程序员创建的用于存储临时值的对象,而是指编译器层面上的临时对象:这种临时对象不是由程序员创建,而是由编译器为了实现某些功能(例如函数返回,类型转换等)而创建. 由于临时对象不是由程序员创建,其生存期由编译器掌控,因而也就不允许程序员对其进行更改,将其绑定到non-co 阅读全文
posted @ 2015-09-23 22:11 Reasno 阅读(546) 评论(0) 推荐(0) 编辑
摘要:1. Over-eager evaluation("超急评估"):超前进度地做"要求以外"的更多工作,也就是在要求之前就把事情做下去.例如,以下class template用于表现数值数据的大型收集中心: template<class NumericalType> class DataCollect 阅读全文
posted @ 2015-09-23 21:14 Reasno 阅读(354) 评论(0) 推荐(0) 编辑
摘要:1. lazy evaluationg实际上是"拖延战术":延缓运算直到运算结果被需要为止.如果运算结果一直不被需要,运算也就不被执行,从而提高了效率.所谓的运算结果不被执行,有时指只有部分运算结果被需要,那么采用拖延战术,便可避免另一部分不被需要的运算,从而提高效率,以下是lazy evaluat 阅读全文
posted @ 2015-09-22 22:17 Reasno 阅读(779) 评论(0) 推荐(0) 编辑
摘要:1. 80-20法则:一个程序80%的资源用于20%的代码上(80%的执行时间华仔大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面).80-20法则的重点不在于字面上的数字,而是强调"软件的整体性能几乎总是由其构成 阅读全文
posted @ 2015-09-22 20:37 Reasno 阅读(327) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示