Geekband C++ 第四周


vtrp和vtbl

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

this指针

  ○ 虚函数的另一种用法:Template method
  ○ 过程
      ■ myDoc.OnFileOpen() 相当于 CDocument::OnFileOpen(&myDoc),&myDoc相当于this
      ■ 使用指针,向上转型,所以在调用虚函数Serialize()时发生动态绑定,相当于
          ● (*(this->vptr)[n])(this)
          ● 调用CMyDoc的Serial函数
  ○ 例子如下
Geekband C++ 第四周_第2张图片
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
Geekband C++ 第四周_第3张图片
全局operator new和delete

Geekband C++ 第四周_第4张图片
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++ 第四周)