【博览网】面向对象程序设计(下)——第二周课程笔记

来源:互联网 发布:dota2数据分析网站 编辑:程序博客网 时间:2024/05/19 17:58

本周课程课程主要是对C++一些底层特性的讲解,平时开发中可能较少接触到这些内容,但是有所了解对程序开发还是很有帮助的。对于之前课程已经讲解过的内容,在此不再赘述。

一、对象模型
1.虚表vtbl和虚表指针vptr

![这里写代码片](http://img.blog.csdn.net/20170812193202447?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHl4X3lhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

在之前的笔记中曾经提及过虚函数的实现问题,但是讲解的并不多。上图十分形象的讲解了虚函数在C++底层是如何实现的。在底层,凡是有虚函数的类都会自动生成一个虚表指针,这个指针指向一个虚表,虚表上是指向各个虚函数的指针。对象在调用虚函数的时候,会通过虚表指针,在虚表中根据索引号找到对应函数的函数指针,跳转到对应函数中。可见,虚函数本身的调用相比非虚函数效率要更加低。同时,这一机制也解释了为什么父类的虚函数在子类继承时自动为虚函数,因为函数本身会放在虚表中。这种机制实现了在不知道对象具体类型的情况下,在运行期实现多态。
2.this指针
在之前的笔记中有提及,对象在调用成员非静态函数时,会往里面自动传入一个指向自身的this指针,因此对象可以调用内部的数据和函数。在对象的成员函数内,对对象其他成员函数的调用也是通过this来实现的。因此,利用这个特性,我们可以在父类中写一个函数,其中的关键部分设置为虚函数,交给子类来实现,当子类或者父类指针调用该父类的函数时,里面的虚函数部分自动变为子类或者父类指针所指向的对象内部对应的实现。这是一项在程序开发中经常使用的特性,非常重要。

二、const
const的内容在第一部分的课程中讲解的已经比较多了。这里补充一个要点:在C++中,含有const和不含有const,其他内容一样的成员函数可以重载。并且,一旦重载时,const对象会调用const版本,非const对象会调用非const版本,不存在二义性。

三、重载new和delete
C++有很多运算符都可以重载,包括new和delete这两个用于分配和回收内存的函数。这部分内容对于新手而言可能用的比较少,但是对于将来需要进行对于效率要求比较高的程序开发的时候还是很有帮助的。
这两个函数的基本形式如下:

void* ::new(size_t);void ::delete(void*);  //全局重载,所有的分配函数都会被改变void* Foo::new(size_t);void Foo::delete(void*);  //局部重载,只有Foo的对象会受影响

另外,则两个函数还可以有多参数的重载版本。但是第一个参数必须是上面的指定参数。多参数版本的delete函数并不是在delete时调用,而是在对应的new版本发生异常时调用,用来清除对应分配的内存空间。

阅读全文
0 0
原创粉丝点击