技术书籍阅读笔记
文章平均质量分 69
Beyond_阿炳
C++er
展开
-
[读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(上)
整理一下第二章的内容,共之后参考回顾。注:以下部分图片来源于原书1. 默认构造函数会在需要的时候被编译器产生出来,要注意字眼“需要的时候”,例如如下代码:class Bat{public: int val; Bat* pNext; void bat_yell();};void Bat::bat_yell(){ Bat batMan; if(batMan.val ||原创 2016-08-22 21:54:08 · 604 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(中)
继续整理第五章的内容,关于对象复制的。 对于默认的拷贝赋值操作符,在如下情况下不会表现出按位拷贝(bitwise copy:关于按位拷贝,实际就是不使用拷贝构造函数或者拷贝赋值操作符,这里的不使用是指编译器根本不会产生,而是采用按位拷贝对象数据的方式,若对象中含有指针,此时的指针只是地址级别的浅拷贝,可能会引起内存问题): a. 当类内带有一个含有拷贝赋值操作符的成员变量时。原创 2016-09-22 23:43:37 · 758 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第六章-执行期语义学(下)
继续整理第六章剩下的内容,关于临时对象的几条准则。1. 在某些情况下,编译器可以产生必要的,或者可以带来方便的临时对象,具体行为由编译器来定义。例如,对于如下操作:T a, b;T c = a + b;//T operator+ (const T&, const T&)a. 编译器会产生一个临时对象,放置a+b的结果,然后使用T的拷贝构造函数,把临时对象当作c的初始值。b. 另外一种原创 2016-10-11 21:26:47 · 336 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(下)
继续整理第五章剩下的内容,关于析构函数语义的。1. 如果类没有定义析构函数,那么只有类中含有成员对象(或者本类的基类)拥有析构函数的情况下,编译器才会合成一个出来,否则析构函数被视为不要,也就不需要合成。例如,如下类,虽然Point类拥有虚函数:class Point {piblic: Point(float x = 0.0, float y = 0.0); Point原创 2016-09-26 22:25:58 · 466 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)
继续整理最后一章的内容,这一篇是关于异常处理的。注:初学markDown,所得尚少,排版简陋,多多包涵欲支持异常处理,编译器的主要工作是找出catch子句,追踪程序堆栈中每一个函数的当前作用域,编译器必须提供某种查询异常对象的方法,以知道其实际类型(RTTI来源),最后,编译器还需要某种机制管理被丢出的对象,包括其产生,存储,析构,清理。C++异常处理语法由三部分组成: 1. throw,抛出异常原创 2016-10-26 22:00:37 · 397 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)
整理最后一章的内容,关于模板,异常处理以及运行时类型信息的(RTTI: Run Time Type Information)。原创 2016-10-17 23:20:22 · 393 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(下)
整理本系列笔记的最后一篇,关于运行时类型信息(RTTI)。保证安全的向下转型向下类型转换:是指由父类向子类的类型转换,由于父类信息少于子类,所以通常来说,没有特殊机制支持的话,这种转换是不安全的,要支持此机制的话,在空间和时间上都需要额外的负担: 1. 空间上,需要额外的空间存储类型信息,通常是一个指针,指向某个类型信息节点。 2. 时间上,需要额外的时间,已决定执行期的类型。 一种主流的策略原创 2016-11-01 23:51:02 · 462 阅读 · 0 评论 -
[读书笔记] 重构改善既有代码的设计(1)
《重构:改善既有代码的设计》已经读了一大半了,书中讲了很多的重构手段和指导原则,但整体感受下来,重构的一个主要目的就是消除重复,放眼看去,众多的重构手段都是在消除重复代码,提炼函数,提炼父类等等。 之后会针对每一章,整理一下读书笔记,方便之后参阅。第一章:重构,第一个案例着一章主要是起到入门的作用,以一个不是很复杂的例子,一步步演示可以进行哪些重构,也用到了后面章节提到的部分重构手段,但是主要目的原创 2017-01-16 21:09:04 · 505 阅读 · 0 评论 -
[读书笔记] 重构改善既有代码的设计(3)
继续整理本书的内容。第四章:构建测试体系。关于测试体系的几条参考准则: 1. 确保所有的测试都完全自动化,让他们检查自己的测试结果。 2. 一套测试就是一个很强大的bug侦测器,能够大大的缩减查找bug所需的时间。 3. 频繁的运行测试,每次编译请把测试也考虑进去,至少每天执行一遍每一个测试。 4. 每当收到bug报告,请先写一个单元测试来暴露bug。 5. 编写未臻完善的测试并实际运行,原创 2017-04-04 21:29:36 · 404 阅读 · 0 评论 -
[读书笔记] 重构改善既有代码的设计(5)
继续整理下第七章的内容, 关于对象属性的迁移。1. 迁移函数当某个函数与其不所属类有着更密切的关系时,考虑把该函数移到新类中,在新类中建立一个有着类似行为的函数,移除就函数,或者将旧函数变成一个单纯的委托函数。这样做的目的是减少类间的耦合,保证类更简单。2. 迁移字段跟第一条类似,如果类的某个成员被另一个类更加频繁的使用,则考虑移到另一个类中,注意这里的使用不一定是直接使用,也有可能是通过取值设值函原创 2017-05-04 22:09:00 · 504 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第四章-Function语义学(中)
继续整理第四章的内容,注:以下部分图片来自于原文1. 单继承情况下的虚函数调用: 对于多态虚函数的调用(通过基类指针或者引用),例如ptr->z();,需要知道两个信息: a. ptr所指对象的真实类型,这可以使我们选择正确的z()实体; b. z()实体位置,以便可以调用它。结合以上的所需信息,需要为每一个多态的类对象身上增加两个成员: a. 一个字符串原创 2016-09-13 21:22:01 · 670 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第四章-Function语义学(中续)
继续整理函数调用的第三种情况内容,注:以下部分图片来自于原文3. 虚拟继承情况下的虚函数调用: 如下例子,Point3d虚拟继承自Point2d:此时的内存布局如下,注意此时虽然Point3d只有唯一一个基类(最左边的)Point2d,但是它们的布局并不像非虚拟继承的单一继承那样,二者之间不再相符,二者之间的转换也就需要调整this指针,因为此时Point3d中原创 2016-09-14 23:28:35 · 369 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第四章-Function语义学(上)
开始整理第四章的内容,关于函数的东西。1. 静态成员函数不可以是const的,原因是因为this指针,详细参考:http://blog.csdn.net/beyongwang/article/details/524036972. 成员函数可以分成几类:a. 非静态成员函数:此类函数会隐含一个this指针传入函数体,举个例子,对于如下函数:float A::non_Static_原创 2016-09-10 21:43:24 · 565 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第一章《关于对象》
最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。下面是第一章的内容整理,注:以下部分图片来源于原书:关于对象(Object Lessons)1. C++在布局以及存取时间上的额外负担是由virtual引起。这里指的是C++中虚函数以及虚继承原创 2016-08-21 21:14:18 · 2642 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(中)
继续整理第二章的内容,是关于拷贝构造函数的。1. 有三种情况会以一个对象的内容作为另一个类对象的初始值:a. 明确的以一个对象初始化另一个对象,例如: A a1 = a2;//会调用类A的拷贝构造函数初始化a1。b. 对象被作为参数传递给某个函数时:foo(A a){...}; A a1; foo(a1);//a1作为参数的初值。c. 当传回一个类对象时,A foo() {A a1原创 2016-08-23 20:28:23 · 428 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(下)
继续整理第二章节剩下的内容。1. 对于明确d原创 2016-08-25 00:05:46 · 587 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第三章 Data语义学(中)
继续整理第三章的内容(以下部分图片来自于原书):1. 在只有继承没有多态的情况下,子类是的内容就是父类加上子类特有的数据成员,例如,对于如下两个类,Point2d和Point3d,后者公有继承自前者,此时的数据布局如下所示:在某些情况下,把一个类分解成多层,可能会导致类所占用空间的膨胀,例如,如下类,算上对齐操作大小为8 (4 + 1 + 1+1 +(1对齐)):而如果原创 2016-09-04 23:18:08 · 600 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第三章 Data语义学(下)
整理第三章最后的部分内容,关于数据成员指针的,之前竟然没听过类数据成员指针一说,果然路漫漫其修远兮啊。注:以下例子和图片来源于原书。1. 数据成员指针是指指向类数据成员的指针,其内容为对应数据成员在类对象中的偏移量,类型为A::*,例如,如下类:class Point3d { public: virtual ~Point3d(); protected:原创 2016-09-05 22:27:40 · 475 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第六章-执行期语义学(中)
国庆假期小栖,继续整理第六章的内容。关于new和delete运算符。a. 使用new运算符构造对象时, 例如:Point3d* origin = new Point3d;会被转化为两个操作:分配空间和调用类的构造函数:Point3d* origin;if(origin = __new(sizeof(Point3d))){ origin = Point3d原创 2016-10-08 23:57:53 · 288 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(上)
继续整理第五章的内容,关于累的三个重要函数:构造函数,析构函数,拷贝构造函数。注:以下部分图片来自原书1. 无继承情况下的对象构造。当类中存在虚函数时,编译器会对该类产生膨胀作用, 例如如下类:class Point {public: Point(float x = 0.0, float y = 0.0) : _x(x), _y(y){} virtua原创 2016-09-20 00:17:30 · 767 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第四章-Function语义学(下续)
第四章的最后,补充几点关于内联(inline)函数的:inline函数参数带有副作用,或者是以一个单一的表达式做多重调用,或是inline函数中有多个局部变量,都会产生临时对象,可能会产生大量的扩展码,是程序的大小膨胀,所以inline函数的使用必须要谨慎:1. 对于单一表达式的多重调用:对于如下incline函数:inline Point operator+ (const P原创 2016-09-18 00:16:47 · 342 阅读 · 0 评论 -
[读书笔记] 深入探索C++对象模型-第四章-Function语义学(下)
继续第四章的内容整理,这一部分也是第四章的最后一部分,是关于成员函数指针的,第三章下的内容整理是关于成员变量指针的,这个则是成员函数指针,二者可以互为参考。1. 非虚成员函数指针(非静态)。取一个非静态成员函数的地址,如果该函数是非虚函数,则得到的是它在内存中的真正地址,但是该地址并不完全,需要绑定与具体的类实例(对象)之上,借助对象的地址(this指针)才可以被调用,例如:一个成员函数指原创 2016-09-17 22:13:07 · 439 阅读 · 0 评论 -
[读书笔记] 重构改善既有代码的设计(4)
最近比较忙,偷闲整理下第六章的内容,关于重新组织函数的内容。1. 提炼函数比较简单但又很常用的手法,目的是把一段逻辑上紧密联系构成相对独立功能块的代码封装起来,通过函数名字清晰的表达其用途,这样潜在的提供了其他模块复用该函数的概率,同时也更加易于维护,因为原来嵌在一大段逻辑中的代码被抽离出来了,对其修改不必在去关系大范围的影响。实施这个重构手法时要注意涉及的上下文变量,可以通过参数,返回值,甚至是添原创 2017-04-27 21:47:03 · 355 阅读 · 0 评论