GEEKBAND面向C++下第二周

虚指针和虚表 vptr vtbl

GEEKBAND面向C++下第二周_第1张图片
QQ图片20161102195640.png
  • vptr:虚指针,内存占用4字节,只要类里面有虚函数,就会产生指针,如左图,一万个虚函数也会一个指针,对比数据相加会多4,而且不管有多少虚函数,都会只有一个虚指针。
  • vtbl:虚表,放置虚函数的地方,虚指针指向虚表。
GEEKBAND面向C++下第二周_第2张图片

静态绑定

  • 译器生成 cal xxxx 语句l

动态绑定

  • 指针调用
  • 向上转型(猪向动物)
  • 调用虚函数
GEEKBAND面向C++下第二周_第3张图片
(*p->vptr[n])(p) //n是虚表中存放的位置


关于this

  • 所有的成员函数一定有个隐藏的this pointer
GEEKBAND面向C++下第二周_第4张图片
CDocument::OnFileOpen(&myDoc)  &myDoc就是this


Const

  • const 对象只能调用const成员函数
  • non-const对象可以调用const成员函数和non-const成员函数
  • non-const 成员函数可以调用const成员函数,反之则不行
  • 成员函数的const和non-const版本同时存在:const object只能调用const版本,non-const object只能调用non-const版本

关于new和delete

String* ps = new String("hello");
//转为
void* mem = operator new(sizeof(String));
ps = static_cast(mem);
ps->String::String("hello);

重载::operator new delete

  • 接管使用者行为、全局new 和delete,掌管内存分配
GEEKBAND面向C++下第二周_第5张图片

以上为全局重载


成员 operator new delete

  • 接管成员函数的new delete重载,做一个内存尺
  • 对于某个类重载其operator new/delete的函数,可以只针对这个类使用自定义的内存管理。
class Foo 
{
    public: 
      void* operator new(size_t); 
      void operator delete(void*, size_t); 
};
Foo* pf = new Foo;//调用重载
delete pf;
Foo* pf = ::new Foo;//使用全局

  • 数组形式同理

new() delete()

GEEKBAND面向C++下第二周_第6张图片

这段没有搞太懂 ………………~


basic_string

GEEKBAND面向C++下第二周_第7张图片
  • 用来扩充余量

你可能感兴趣的:(GEEKBAND面向C++下第二周)