深度探索C++对象模型 chapter 3

发布时间:2019-06-24 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了深度探索C++对象模型 chapter 3脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Data 语意学

class X{};
class Y : public virtual X{};
class Z : public virtual X{};
class A : public Y, public Z {};
/* linux 3.10 gcc 4.8.5  X86_64 不同平台是不同的*/
sizeof (X) : 1 byte
sizeof (Y) : 8 byte
sizeof (Z) : 8 byte
sizeof (A) : 16 byte

深度探索C++对象模型 chapter 3

3.1 Data Member 的绑定

1. 对member function本体的分析,会直到整个class的声明都出现了才开始

extern float x;  

class Point3d {  
public:  
    Point3d(float, float, float);  
    /* Q : 被传回和被设定的x是哪一个x?
     * A : class内部的x
     */  
    float X() const { return x; }   
    void X(float new_x) const { x = new_x; }  
PRivate:  
    float x, y, z;  
};

2. 对member function的argument list的分析,是当即完成的。

tyPEdef int length;

class Point3d{
public:
    void mumble(length val){ _val = val; }; // length is "int" not "float"
private:
    typedef float length;
    length _val;
};

/*该这么写*/
typedef int length;

class Point3d{
 typedef float length;          // correct
public:
    void mumble(length val){ _val = val; }; 
private:
    length _val;
};

3.2 Data Member 的布局

Nonstatic data members在class object中的排列顺序将和其被声明的顺序一样

3.3 Data Member的存取

Point3d origin, *pt = &origin; 

origin.x = 0.0;  
pt->x = 0.0;  

Q : 从origin存取"和"从pt存取"有什么重大的差异?
当Point3d是一个derived class,而在其继承结构中有一个virtual base class,并且被存取的member是
一个从该virtual base class继承而来的member时,就会有重大的差异".这时不能够说ptr必然指向哪一种
class type, 所以这个存取操作必须延迟至执行期经由一个额外的间接导引,才能够解决.
但如果使用Origin,就不会有这些问题,其类型无疑是Point3d class

3.4 "继承"与Data Member

class concrete1 {
public:
 // ...
private:
 int val;
 char bit1;
};
class Concrete2 : public Concrete1 {
public:
 // ...
private:
 char bit2;
};
class Concrete3 : public Concrete2 {
public:
 // ...
private:
 char bit3;
};

作者扯淡呀, 在gcc上 Concrete3 的大小为8B 没有padding呀!!!!

脚本宝典总结

以上是脚本宝典为你收集整理的深度探索C++对象模型 chapter 3全部内容,希望文章能够帮你解决深度探索C++对象模型 chapter 3所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。