object

第一:

类中的非内联(no inline)成员函数 不管存在多少份类的实例,只会存在一个非静态成员函数实体

如果一个类中存在一个或者多个inline内联函数,则只会在这个类的实例中存在这个内敛函数实体

C++在内存布局以及存取时间上主要的额外负担是由Virtual引起的,虚函数

01>虚函数(virtual function)机制  用以支持一个有效率的“执行期绑定”

02>virtual base class 用以实现“多次出现在继承体系中的base class 由一个单一而被共享的实体”

 

 

class xxx{

public:

        xxx(){}

        virtual ~xxx(){}

private :

        int _i;

        string name;

} ;

 xxx me ;

int _tmain(int argc, _TCHAR* argv[])

{

        int i = 0;     

        cout<<sizeof(me)<<endl;

        cin>>i;

        return 0;

}

 

xxx 16byte

其中int 4  string 8  指向虚拟表的指针占4

所以总数是16

 

string str;

str 的长度是8bytes ,包括4字节的字符指针和一个来表示字符串长度的整数?

P63

 

2008/11/27

class Point3d{

  public:

    virtual ~Point3d(){}

  float x, y, z;

} snail;

&Point3d::x      取得的是X在类Point3d中的offset偏移量

&snail.x         取得的是x在一个实例化实体中的地址,也就是在内存中的地址

<深度探索C++对象模型>p164  中说道:“取一个nostatic date member的地址,将会取得该成员在类中的偏移量offset 取一个 绑定于真正class object(对象实体)身上的date member 的地址,将会得到改member在内存中的真正地址

 

将得到的改member在内存中的地址 减去 member在该类中的偏移量,然后加一,即是改类对象在内存中的地址!!!

这里的加一操作主要是为了区分“没有指向任何date member的指针  和一个指向第一个date member 的指针” 提出来的

例如:

    float Point3d::*p1 = 0;

    float Point3d::*p2 = Point3d::x;

注:Point3d::* 是一个指向Point3d date member 的指针类型

那么如何区分 p1 p2那?

为了区分p1 p2 ,每一个真正的 member offset 值都被加上一。因此,不论编译器或使用者都必须记住,在真正使用该值以指出一个member以前,都必须减掉一

注意。 这里的 如果虚拟表指针 *vptr 放在对象的尾部的话,这是必须做的

但是放在头部的话,这样做还有用吗?

不知道

 

 

p185

多态:在c++中表示 “以一个public base class 的指针或者引用,寻址出一个dcrivcd  class object ”的意思!!!

 

P201

不要在一个virtual base class 中声明nostatic data members .? 为什么?

P216

如果一个函数 被声明为inline 但是编译器因其复杂度,或因其建构问题,判断这个函数不可称为inline ,则它会被转为一个static函数。并在“被编译模块”内产生对应的函数定义

 

p223 构造 解构 拷贝 语义学

如果一个类中含有pure virtual function (纯虚函数) 则这个类不允许实例化。 即是抽象类

纯虚函数定义:  virtual return_type function_name() = 0;

如果一个类中没有定义明确的构造函数,则其类成员的值就不确定

例如: 一个抽象类

class Abstract_base{

 

public:

        virtual ~Abstract_base() = 0;

        virtual void interface1() const = 0;

        virtual const char* mumble() const{return _mumble;}

 

protected:

        char *_mumble;

 

};

被一个派生类继承

class child:public Abstract_base{

 

public:

        child(int eval):len(eval){}

   

 

private:

        int len;

};

如果child mychild

mychild中继承自抽象类中的字段值,就不能确定

P225

如果在子类中调用基类的纯虚函数的话,基类必须定义纯虚的析构函数,因为编译器会将子类的析构函数加以扩展,以静态调用方式调用 每一个virtual base class 以及上一层base class的析构函数。 因此只要缺乏任何一个base class 析构函数的定义,就会导致连接失败

 

 

p229

c++中的所有全局对象都被当作“初始化过的数据”来对待

p232  仔细看看

239

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值