C++面向对象程序设计(下)第二周学习笔记——Boolan

在完成了C++面向对象高级编程(下)第二周的学习之后,有一些总结和心得在这里通过学习笔记的方式分享出来,笔记我是跟着老师在视频中所讲的内容按照顺序记录的,也不能说是流水账,对课程中的一些问题还是添加了自己的理解和分析,供也在学习C++的小伙伴用作学习交流,如有理解不到位的地方,欢迎批评指正。

本周主要学习的内容是C++的对象模型,通过对于对象模型的深入学习,了解了虚函数、多态、this指针,以及增加了new、delete部分的详细介绍。

一.对象模型(Object Model)


当我们创建出继承关系如上图的A类型、B类型、C类型的对象a、b、c时,它们的对象模型如下图:


我们发现,对象中占空间的不仅仅是一些类中所声明的成员,还包括了虚函数的指针(vptr),一个类中只要有虚函数而无论有多少个,虚函数指针的个数始终为1个;虚函数指向的是虚函数的地址;一个类中可能会出现多个虚函数,所以这些地址会统一存放在一个列表中,称作虚表(vtbl);图中还可以看到,没有重写的虚函数都指向同一个地址。

1.动态绑定(Dynamic Binding)

动态绑定是将一个过程调用与相应代码链接起来的行为。是指与给定的过程调用相关联的代码,只有在运行期才可知的一种绑定,它是多态实现的具体形式。

C++中,通过基类的引用或指针调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。

C++中动态绑定是通过虚函数实现的。而虚函数是通过一张虚函数表(virtual table)实现的。这个表中记录了虚函数的地址,解决继承、覆盖的问题,保证动态绑定时能够根据对象的实际类型调用正确的函数。

在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。


我们创造一个容器,里面装的是指针;这些指针全部都是经过了向上转型后的对象;(类型都是指向A类的指针);A*类型的变量,会根据指向不同的类(基类或子类)的实例,根据vptr指向的对应函数地址,执行不同的函数,从而实现多态。

所以,虚函数加上继承是实现多态的手段。动态绑定必须满足以下三个条件:

必须通过指针调用函数;

指针必须是向上转型;

调用的函数必须是虚函数。

2.关于this指针


按照灰色箭头的路径:在右边的main函数中,先创建一个子类的对象myDoc,然后子类的对象调用的是父类的函数,通过对象调用一个函数,那么这个对象的地址就是this Pointer;所以这条语句可以写成底下那种形式(&myDoc就是this Pointer)。这个时候,既然调用的是父类的函数,其实就已经是向上转型了。进入函数后,再执行到虚函数Serialize()的时候,调用函数的方式就入图中左上角所示。其中n是虚函数在虚表中的位置。

二.关于const

当成员函数的const和non-const版本同时存在时,const object只能调用const版本,non-const object只能调用non-const版本。注意,const是算作函数签名的一部分的。


上表描述了何时使用member function和object在分别为const和non-const时的关系。

关键字const在程序中起着至关重要的作用,往往在决定一个函数的功能时就可以考虑要不要在返回类型前加上const了。非成员函数的关键字const添加在函数名前;类中的成员函数添加const的位置如下述代码所示:


如果当初设计string::print()时未指明const,那么上行便是经由const object调用non-const

member function,编译器会报错:


三.关于new和delete

之前的课程也有学习过,new是先分配memory,再调用ctor;delete是先调用dtor,再释放memory。


其中operator new分为全局的和属于某个类的区分。可以通过重载operator new(operator new[])或operator delete(operator delete[])函数来自己控制内存的管理。

重载::operator new是一件危险的事情,因为重载的是全局函数,这可能导致程序中以后每一个new的动作都会调用你自己写的operator new,这样分配空间是不确定的。同样,重载::operator delete也一样,只不过两者传入的参数不同;前者传入的是size_t类型,表示要被分配的空间,后者传入的是一个指针,表示要释放的地址。

可以在类中去重载new和delete,这样做只针对这个类使用自定义的内存管理:


使用new或delete时可以指定使用全局的operator new或operator delete函数:


我们可以重载class member operator new(),写出多个版本,但前提是每一个版本的声明都必须有独特的参数列,即多参数。比如:

Foo* pf = new(300,’c’)Foo;

第一参数必须是size_t,其余参数以new所指定的placement arguments为初值,出现于new(…)小括号内的便是所谓的placement arguments.

我们也可以重载class member operator delete(),写出多个版本。但它们绝不会被delete调用,只有当new所调用的ctor抛出exception时,才会调用这些重载版本的operator delete()。

����� %

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容