zoukankan      html  css  js  c++  java
  • 对象模型(简单)

    对象模型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

  • 相关阅读:
    Android Studio 1.0 初体验
    JAVA笔记:死锁的详细解释
    JAVA笔记:多线程的理解及应用(三)
    JAVA笔记:多线程的理解及应用(二)
    JAVA笔记:多线程的理解及应用(一)
    mysql 中文编码
    k8s删除node
    k8s 卸载
    kubernetes 集群master变更ip地址
    docker常用指令
  • 原文地址:https://www.cnblogs.com/yan1345/p/NotesOfObjectModelSimple.html
Copyright © 2011-2022 走看看