![](https://img-blog.csdnimg.cn/20200601005623789.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《深度探索C++对象模型》笔记
《深度探索C++对象模型》被称为C++中高级程序员的必看书,虽然成书时间较早,但其蕴含的思想依然非常值得学习。
Niu Yutao
非科班转码
展开
-
《深入探索C++对象模型》第三章 Data语意学(The Semantics of Data)
先从一个例子开始,假如给定以下class的定义及继承关系:class X { };class Y : public virtual X { };class Z : public virtual X { };class A : public Y, public Z { };则分别对class X,class Y,class Z和class A求sizeof()的值是多少?答案可能不那么直观,因为乍一看这几个类都没有任何成员,所以应该都是空的,但实际上,...原创 2020-08-04 20:06:43 · 216 阅读 · 0 评论 -
《深入探索C++对象模型》第二章 构造函数语义学(The Semantics of Constructors)
一、default constructor的构造操作先看一个小例子:class Foo { public: int val; Foo *pnext; };此处正确的程序语意是要求Foo有一个默认构造函数,能将它的两个成员初始化为0,那么编译器会为我们合成这样的默认构造函数吗?答案是不会!(事实上,这里合成的默认构造函数是trival的构造函数,也就是它什么也不干,连初始化也不干。在概念上我们把这种构造函数叫做implicit trival default constructors,但实际上这种原创 2020-06-02 02:30:11 · 199 阅读 · 0 评论 -
《深入探索C++对象模型》第一章 关于对象(Object Lessons)
一、加上封装后的布局成本书的开始给了一个Point3d的例子。如果按C的方法是要定义一个结构体,并定义操作结构体的函数或者宏。之后按C++的做法把Point3d封装起来,可以简单地写一个类,也可以按继承的方式来定义几个类,也可以使用类模板。除了程序设计上的思想上不一样,这两种Point3d实现的功能是完全一样的,那么既然C++的Point3d是封装起来的,这种方式是否在内存布局上增加了额外的成本呢?答案是没有!(当然,这是因为Point3d中包含的只是几个非静态成员,和几个非静态非内联非虚函数的成员原创 2020-06-01 02:22:43 · 303 阅读 · 0 评论