Boolan - C++学习笔记 二 - 第二周

C++程序设计(2)


第二周笔记

1 对象模型(object model)

1.1 关于虚指针(virtual point)和虚表(virtual table)

Boolan - C++学习笔记 二 - 第二周_第1张图片

每个具有虚函数的类的对象都有一个虚指针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)


Boolan - C++学习笔记 二 - 第二周_第2张图片

动态绑定的三个条件:

A* pa = new B;

pa->vfun();

1、通过指针来访问

2、访问虚函数

3、向上转型up-cast

关于Const关键字

Const是函数签名(signature)的一部分。

Boolan - C++学习笔记 二 - 第二周_第3张图片

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参数是有编译器传进来的。

下图是全局重载,影响非常大。

Boolan - C++学习笔记 二 - 第二周_第4张图片

你可能感兴趣的:(Boolan - C++学习笔记 二 - 第二周)