美文网首页
第五周 C++面向对象高级编程(下)Boolan

第五周 C++面向对象高级编程(下)Boolan

作者: 一般的路人丙 | 来源:发表于2017-02-23 18:48 被阅读0次

    8. 对象模型:关于 vptr 和 vtbl

    对象模型:关于 vptr 和 vtbl

    有虚函数,就会多一个指针vptr,数据多4byte。
    继承函数继承的是调用权
    继承数据
    父类有虚函数,子类一定有。
    虚表 virtual table
    vptr 指向 vtbl
    vtbl 里面有指针指向虚函数

    Paste_Image.png

    c 里面调用函数,会 call 然后 return,这叫静态绑定
    而有虚函数,会动态绑定

    (* (p->vptr)[n])(p);
    (* p->vptr[n])(p);
    

    符合三个条件就会使用上面这个动态绑定的形式。

    1. 通过指针来调用
    2. 指针必须向上转型 upcast(类型是父类指针)
    3. 调用的是虚函数

    动态绑定要看 p 指向的是什么。
    右下角这种模式叫做“多态”,可以指向多种类的对象。

    list<A*> myLst;
    

    9. 对象模型(Object Model)

    9.1 关于 this

    关于 this

    this 是一个指针
    这种用法叫做 Template Method
    虚函数的用法主要有两种,这个和多态。
    子类可以调用父类的函数

    9.2 关于 Dynamic Binding

    关于 Dynamic Binding Paste_Image.png

    对象调用,必然是静态绑定

    10. 谈谈 const

    谈谈 const
    double real () const { return re ; }
    
    Paste_Image.png

    const 只能放在成员函数的而后头,全局函数是不能放 const 的。
    表示这个成员函数不打算改变 class 的数据。请编译器把关。
    如果成员函数没有 const,那么 const object 会无法调用这个成员函数。

    COW:Copy On Write
    写的时候要先拷贝一份出来
    常量字符串不需要考虑 COW
    当成员函数的 const 和 non-const 版本同时存在,const object 只会调用 const 版本,non-const object 只会调用 non-const 版本。

    11. 关于 new,delete

    new,delete

    new 有三个动作
    传进来
    重载
    malloc
    class 是可以重载 new 和 delete 的。

    11.1 重载 ::operator new, ::operator delete,::operator new[],::operator delete[]

    重载 ::operator new, ::operator delete

    影响层面非常广,因为重载的是全局。

    11.2 重载 member operator new/delete

    重载 member operator new/delete

    delete 的第二个参数size_t是可选的。

    重载 member operator new[]/delete[]

    重载 member operator new/delete

    传进来的 size_t 和前面大小不一样。

    11.2.1 示例,接口

    示例,接口

    可以强制调用 globals

    Foo* pf = ::new Foo;
    ::delete pf;
    

    示例

    示例

    中括号数组的版本,值得注意的地方
    int 4
    long 4
    string 里是一个指针,也是4
    虚函数就有虚指针,4
    学会用 sizeof()
    建立数组,每个都要调用一次构造函数。
    第一个值记录数组大小,值是5。counter 计数器。

    示例

    示例

    11.3 重载new(),delete()

    重载new(),delete()

    我们可以重载 class member 的 operator new()
    可以写出多个版本,但是每个版本的参数列不能相同。
    我们也可以重载 class member 的 operator delete()
    但是不会被 delete 调用,只有……
    即使 delete() 与 new() 没有一一对应,编译器也不会报错。

    Paste_Image.png Paste_Image.png

    12. Basic_String 使用 new(extra)扩充申请量

    当我们想无声无息的添加一些内容的时候,可以使用这种形式。

    Basic_String 使用 new(extra)扩充申请量

    相关文章

      网友评论

          本文标题:第五周 C++面向对象高级编程(下)Boolan

          本文链接:https://www.haomeiwen.com/subject/tdazbttx.html