美文网首页
Geekband C++ 第四周

Geekband C++ 第四周

作者: billow06 | 来源:发表于2016-08-14 19:50 被阅读0次

    vtrp和vtbl

      ○ 虚指针:
          ■ 对象包含虚函数数,则对象内存模型包含有一个(虚)指针,指向虚表
      ○ 虚表:存放虚函数的地址
      ○ 静态绑定:编译器生成 cal xxxx 语句l
      ○ 动态绑定
          ■ 条件
              ● 通过指针绑定
              ● 指针向上转型
              ● 调用虚函数
          ■ 编译器编译成,相当于下面的形式,p表示调用虚函数的指针
              ● (*(p->vtr)[n])(p)
              ● (* p->vptr[n])(p)
          ■ 实现多态的关键
      ○ 例子如下
    
    clipboard(1).png

    this指针

      ○ 虚函数的另一种用法:Template method
      ○ 过程
          ■ myDoc.OnFileOpen() 相当于 CDocument::OnFileOpen(&myDoc),&myDoc相当于this
          ■ 使用指针,向上转型,所以在调用虚函数Serialize()时发生动态绑定,相当于
              ● (*(this->vptr)[n])(this)
              ● 调用CMyDoc的Serial函数
      ○ 例子如下
    
    clipboard.png

    动态绑定的汇编解释

      ○ 静态绑定:call + 地址
      ○ 动态绑定:call + 虚表查询地址
    

    Const

      ○ 定义:常成员函数:const 位于函数后面
      ○ 知识点
          ■ const object只能调用const member function
          ■ non-const object可以调用const member function和non-const member function
          ■ non-const memeber funciton可以调用const member function,反之则不行
          ■ 成员函数的const和non-const版本同时存在(函数重载):
              ● const object只能调用const版本
              ● non-const object只能调用non-const版本
    

    复习new和delete表达式

      ○ new表达式:先分配memory,再调用ctor
          ■ 先调用operator new(其内部调用malloc)
          ■ 指针类型转换
          ■ 构造函数
      ○ delete表达式:先调用析构函数,在释放内存
          ■ 析构函数
          ■ 调用operator delete(其内部调用free)
    

    重载operator new和operator delete

      ○ 重载全局operator new和operator delete,例子如下
      ○ 重载member operator new和operator delete,例子如下
      ○ 调用member operator new和delete
          ■ Foo* pf = new Foo
          ■ delete pf
      ○ 调用全局operator new和delete
          ■ Foo* pf = ::new Foo
          ■ ::delete pf
    
    全局operator new和delete
    member operator new和delete

    重载placme new和delete

      ○ 重载class member operator new(), 写出多个版本,前提是每一版本的声明都必须有独特的参数,其中第一个必须是size_t,其余以new所指定的placement arguments为初值
      ○ 也可以重载class member operator delete,写出多个版本,但绝不会被delete调用。只有当new调用的ctor抛出exception,才调用这些重载版的operator delete()。
      ○ 例子,标准库中的basic_string

    相关文章

      网友评论

          本文标题:Geekband C++ 第四周

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