虚指针和虚表 vptr vtbl
- vptr:虚指针,内存占用4字节,只要类里面有虚函数,就会产生指针,如左图,一万个虚函数也会一个指针,对比数据相加会多4,而且不管有多少虚函数,都会只有一个虚指针。
- vtbl:虚表,放置虚函数的地方,虚指针指向虚表。
静态绑定
- 译器生成 cal xxxx 语句l
动态绑定
- 指针调用
- 向上转型(猪向动物)
- 调用虚函数
(*p->vptr[n])(p) //n是虚表中存放的位置
关于this
- 所有的成员函数一定有个隐藏的this pointer
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<String*>(mem);
ps->String::String("hello);
重载::operator new delete
- 接管使用者行为、全局new 和delete,掌管内存分配
以上为全局重载
成员 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()
这段没有搞太懂 ………………~
basic_string
- 用来扩充余量