博览网 侯捷老师C++课程 第五周笔记

来源:互联网 发布:中老年服饰淘宝模特 编辑:程序博客网 时间:2024/05/07 13:28

对象模型 关于vptr和vtbl

  • 虚指针和虚表,一个类的对象内存占用什么样的内存?当一个类有虚函数的时候,对象里面就会多一个指针。一个虚函数和一万个虚函数是一样的。
  • 继承会把成员变量继承也会把函数继承下来。
  • 一般的函数和虚函数区别。
  • 虚拟表中存放的都是指针,虚函数指针。
  • 编译器看见调用虚函数时,采用动态绑定。通过虚指针,查看虚表,再看调用的是哪一个函数。(普通函数调用采用动态绑定)(* p->vptr[n])(p);编译器会找到n的位置编号。
  • 静态绑定 call cll……
  • 动态绑定,条件1、通过指针调用;2、指针是向上转型 up case;3、调用的是虚拟函数。(多态)

关于this

  • 模板方法,this指针的使用场景。会把当前对象当做this指针传到方法里面。一个父类的方法A里面调用了一个虚函数,这个虚函数在子类中重载,这样当子类调用父类的方法A时,会通过父类的A函数,调用子类重载过的虚函数。
  • 所有的成员函数都隐藏了一个this参数。

关于 Dynamic Binding

  • 非指针调用不会产生动态绑定。
  • 通过指针找到虚指针,找到虚表,找到相应的函数地址。

关于const

  • 当成员函数的const和non-const版本同事存在是,const object只会(只能)调用const版本,non-const object只会(只能)调用non-const版本。
  • const object 调用const 成员函数可行,但是non-const成员函数不可行。
  • non-const object 可以调用 const 成员函数,non-const 成员函数。
  • non-const 成员函数可以调用const 成员函数,反之则不行。

关于New 和 Delete

  • new 先分配 memory,再调用ctor。
  • delete 先调用dtor,再释放memory。
  • array new,一定要搭配 array delete。

重载 new 和 delete 全局函数(编译器调用)

重载全局 ::new ::new[] ::delete ::delete[]

  • inline void* operator new(size_t_size){……分配内存}
  • inline void operatpr delete(void* ptr){……释放内存}
  • 上面的重载函数不能放在namespace中,是全局的函数,影响是非常大的。

重载成员函数 new 和 delete

  • 成员函数 void* operator new(size_t);
  • 成员函数 void operator delete(void*, size_t);
  • 成员函数 void* operator new[](size_t);
  • 成员函数 void operator delete[](void*, size_t);
  • 调用函数时添加了::,调用全局的函数,绕过类所定义的new和 delete版本。
  • 关于new 和new[]参数的大小。有虚函数的对象对多一个指针的大小4。
  • 对象数组[],对多一个4字节的区域,记录数据的大小是多少。
  • 我们可以重载类成员的operator new(),写出多个版本,前提是每个版本的声明都必须有独特的参数列,其中第一个参数必须是size_t,其余参数以new 所指定的placement arguments为初值。出现于new(……)小括号内的便是所谓placement arguments。
  • 我们也可以重载类成员operator delete(),写出多个版本,但是绝对不会被delete调用。只有当new所调用的ctor抛出异常,才会调用这些重载的函数operator delete()。它们只能这样被调用,主要用来归还还未完全创造成功的object所占用的memory。即使operatordelete(……)未能一一对应operator new(……)。也不会出现任何报错。

标准库中String使用 new(extra)扩展

  • string采用new(extra)进行自己的内存分配,用于实现特定内存结构中引用计数的处理。
0 0
原创粉丝点击