读《深度探索C++对象模型》(简体版)的两个疑问
读《深度探索C++对象模型》(简体版)的两个疑问
疑问一:
p.105讲述了继承对象的布局为什么不紧凑(即除去多余的填补空间),书上说是因为要防止在进行对象赋值间时出现意外。但是我搞不清书上的例子为什么会产生意外,以书上的例子来说:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_2=*pc1_1; //将Concrete2赋给Concrete1
若采取紧凑的布局,则布局应该这样:
_____________ ____________
| | | |
| int 4 | | int 4 |
|----------| |----------|
| char 1 | | char 1 |
|----------| |----------|
| | | char 1 |
| padding | |----------|
| 3 | | padding2 |
|__________| |__________|
Concrete1 Concrete2
但此时将Concrete2赋给Concrete1并不会发生任何问题啊,只会将Concrete1的一个padding字节用Concrete2的下面一个char覆盖,除非把Concrete1赋给Concrete2才会将Concrete2下面的一个char用未知数据填充,造成书上所说的情况。这样的话书上例子就应该改成:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_1=*pc1_2; //将Concrete1赋给Concrete2(改)
~~~ ~~~ ~~ ~~
不知道我想的对不对。
疑问二:
p.148讲述的是static member functions(静态成员函数)的由来,作者说是要便于存取static members(静态成员变量),但是static members不是可以直接用“::”存取吗,干吗还要static member functions呢?
疑问一:
p.105讲述了继承对象的布局为什么不紧凑(即除去多余的填补空间),书上说是因为要防止在进行对象赋值间时出现意外。但是我搞不清书上的例子为什么会产生意外,以书上的例子来说:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_2=*pc1_1; //将Concrete2赋给Concrete1
若采取紧凑的布局,则布局应该这样:
_____________ ____________
| | | |
| int 4 | | int 4 |
|----------| |----------|
| char 1 | | char 1 |
|----------| |----------|
| | | char 1 |
| padding | |----------|
| 3 | | padding2 |
|__________| |__________|
Concrete1 Concrete2
但此时将Concrete2赋给Concrete1并不会发生任何问题啊,只会将Concrete1的一个padding字节用Concrete2的下面一个char覆盖,除非把Concrete1赋给Concrete2才会将Concrete2下面的一个char用未知数据填充,造成书上所说的情况。这样的话书上例子就应该改成:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_1=*pc1_2; //将Concrete1赋给Concrete2(改)
~~~ ~~~ ~~ ~~
不知道我想的对不对。
疑问二:
p.148讲述的是static member functions(静态成员函数)的由来,作者说是要便于存取static members(静态成员变量),但是static members不是可以直接用“::”存取吗,干吗还要static member functions呢?
...全文
相关推荐
Cmake3.8.2-win64-x64
发现最新下载的cmake3.12在编译opencv3.0出现问题,cmake3.8.2win64 x64 编译opencv3.0,正常
cmake-3.8.2-win64-x64.zip
最新版cmake64位
cmake-3.8.2-win64-x64.msi
比较经典的一个版本
cmake-3.8.0-rc2-win64-x64 编译工具用于编译
cmake工具,cmake-3.8.0-rc2-win64-x64,用于编译源代码
《深度探索C++对象模型》中文电子版概述
在C++中,我们通过关键字class定义一个类,然后可以创建该类型的实例,也就是对象。例如:public:return 0;在这个例子中,Person类定义了一个成员函数sayHello,然后我们创建了一个Person类型的对象person,并通过它调用sayHello函数。异常安全通常分为三个等级:基本保证、强保证和不抛出保证。基本保证要求在异常发生时,对象处于有效状态但可能与操作前不同。强保证要求如果操作失败,对象应保持操作前的状态不变。


