C++程序设计(2)
第二周笔记
1 对象模型(object model)
1.1 关于虚指针(virtual point)和虚表(virtual table)
每个具有虚函数的类的对象都有一个虚指针vptr,该指针指向虚函数表vtble,该表存放了类的所有虚函数地址,即改数组是函数指针数组。
如果类A派生B,同时B重写了A的虚函数A::fun(),此时类B的对象B
b,b具有虚指针,指向类B的虚函数表,同时,A::fun()位置被重写的函数B::fun()替换掉,如图中B::vfunc1()所示。
C++编译器对于函数的处理,考虑静态绑定(普通函数)和动态绑定或虚机制(虚函数)。
动态绑定必须是用对象指针来访问对象成员,编译成下面所示内容,在程序执行过程中,根据P所指的对象是基类还是派生类成员来决定调用哪一个类的函数。这就现实了多态。
1.2 关于this指针
用This指针来实现模板方法,注意:不是模板函数。
所有非静态成员函数都隐式含有this指针。This指向当前对象。
如myDoc.OnFileOpen()
等价于:Cdocument::OnFileOpen(&myDoc);
OnFileOpen()是类Cdocument的成员函数。
This->Serialize()//Serizlize()是虚函数,因此
等价于:(*(this->vptr)[n])(this)
动态绑定的三个条件:
A* pa = new B;
pa->vfun();
1、通过指针来访问
2、访问虚函数
3、向上转型up-cast
关于Const关键字
Const是函数签名(signature)的一部分。
1、常成员函数:表示函数不能修改类成员变量的值,同时也不能调用可以修改类成员变量值的成员函数。
int getX () const{ return this -> x };
常对象,只能调用类的常成员函数。
ConstString str(“Hello World\n”);
str.print();
str.setX(intx);//can not complie successfully.
2、修饰函数参数void* strcpy(void* dst, const void* src);
3、定义只读变量const intx = 100;
关于New和delete
new和delete都是C++运算符,注:不是函数;
malloc()和free()才是函数。
New和delete内部是分别调用malloc和free函数来实现的。
重载之后的new和delete参数是有编译器传进来的。
下图是全局重载,影响非常大。
网友评论