Fork me on GitHub

对象模型(简单)

对象模型Object Model

class和class之间的关系

十六、复合&继承关系下的构造和析构

(1)Inheritance下的构造和析构 ,从内存的角度去分析,子类包含父类的成分和特性,即变量和函数

(2)composition下的构造和析构

(3)Inheritance+composition下的构造和析构

//继承中的     构造函数与析构调用顺序
//构造顺序: 父类->子类  由内到外
//析构顺序: 子类->父类  由外到内

//继承+组合模式  构造函数与析构调用顺序
Derived::Derived(...):Base(),Component() { ... };
Derived::~Derived(...){ ...  ~Component(), ~Base() };

十七、关于vptr和vtbl

当类中存在虚函数的时候(不管有几个虚函数),对象的内存占用都会多出4bytes,这个空间存放了一个指向虚表(Virtual table:vtbl)的指针(Virtual Pointer:vptr)。虚表里放的都是函数指针

image-20200420151900705

多态的条件

1.函数由指针调用。

2.指针向上转型(up cast),父类指针指向子类对象。

3.调用的是虚函数。

十八、关于this

(1)通过一个对象来调用一个函数,那么对象的地址就是this pointer。传给函数的隐藏的第一个参数。

image-20200420153452293

十九、关于Dynamic Binding

(1)const成员函数,不修改成员变量;

double real () const { return re; }

(2)Dynamic Binding

静态绑定

class B b;
class A a = (A)b;
a.vfunc1();//静态绑定,对象a调用的是A的虚函数

动态绑定

//三个条件:a,指针;b,虚函数;c,向上转型
A* pa = new B;//new出来的对象作向上转型为A ,pa就是this pointer,调用的是A的虚函数。
pa ->vfunc1();
pa = &b; //向上转型
pa ->vfunc1(); //动态绑定;

二十、关于New,Delete

  • 使用new表达式时,实际执行了三步操作:

    • new表达式调用名为operator new(或operator new[])的标准库函数。该函数分配一块足够大、原始、未命名的内存空间以便存储特定类型的对象(或对象数组)。

    • 编译器调用对应的构造函数构造这些对象并初始化

    • 对象被分配了空间并构造完成,转换指针类型,返回指向该对象的指针

      Foo *p = new Foo;
      {
          void *mem = operator new(sizeof(Foo));
      	p = static_cast<Foo*>(mem);
      	p->Foo::Foo();
      }
      

    使用delete表达式时,实际执行了两步操作:

    • 对指针所指向的对象(或对象数组)执行对应的析构函数
    • 编译器调用名为operator delete(或operator delete[])的标准库函数释放内存空间

    配套使用newdelete以及new [ ]delete[ ]

    delete p;
    {
    	p->~Foo();
    	operator delete(Foo);   
    }
    

二十一、Operator new,operator delete

(1)全局的重载

重载::operator new 和::operator delete 
重载::operator new [ ] 和 ::operator delete[ ]

(2)在class里重载

重载::operator new (size_t) 和::operator delete() 
重载::operator new [ ](size_t) 和 ::operator delete[] ()

二十二、示例

二十三、重载new(),delete()$示例

二十四、Basic_String使用new(extra)扩充申请量

(1)new有四种:操作符new,operator new ,new[ ](即array new)和 placement new

posted @ 2020-11-23 23:24  yzhu798  阅读(364)  评论(0编辑  收藏  举报