C++设计与演化读书笔记(二)

C++设计与演化读书笔记(二)

第三章


又来了....

这章主要讲述C++的诞生,其是如何从C with Class 演化过来的: 在3.1-3.3中,作者主要讲述了C with Class的成功,以及其存在的局限性,同时也讲述了为啥要发展C++,以及C++的目标是什么,这部分看了却印象不深……可能是里面有些关于历史的东西自己不了解吧~就不详细说了,后面主要写写自己印象深刻的几个点:


3.4 列出了从C with Class演化成为C++时引进的一些新的特征,后面的几个小节都是围绕这节所提出的特征来讲述的,分别是:

  1. 虚函数
  2. 函数名和运算符重载
  3. 引用
  4. 常量
  5. 用户可控制的自由空间存储区控制
  6. 改进的类型检查

虚函数

虚函数应当是OO里非常重要的概念之一了,因此讨论其起源是非常有必要的,虚函数的思想是从Simula(我也不懂这个……)借鉴来的,为了解释虚函数的用处,作者举了个非常经典的例子,就是定义各种形状的类,每个类里都有自己的draw,当某函数需要绘图时,就需要非常臃肿的switch case 先判断类型,在确定调用的方法来写函数,而虚函数一招可破之,当然作者也说在添加这个特征的时候遇到了极大的阻力,例如说这个虚函数就是个函数指针啊什么的,作者还是力排众议的加进去了。。(当然从这里就会引出了抽象类,虚基类等各种复杂的概念,作者在后面的C++特征部分也进行了详细的讲解)
在加入了虚函数的特征后,必然要考虑的问题就是其应当如何实现,关于如何调用虚函数最重要的问题就是对象布局模型了;也提及了虚函数表的概念,这里给出了一个空间上紧凑的布局模型(间接调用),这里的布局模型很多(目前为止我只从书上了解了几种,但我觉得有些是为了提高运行效率,让空间的布局紧凑;有些是为了减少重新编译的时间,采取更加灵活的布局模型;这部分后面也应当仔细的了解下
还有一个就是经常把人绕晕的覆盖(override)和遮蔽了:这个我在之前的博客中也有讲过,这里重新提一下,对于覆盖:在最早的规则中"要求完全准确的类型匹配",但后来发现对于返回类型而言有些函数会造成非常多的强制转换,这样有时是不安全的,并且作者认为这个规则改动对于整体影响不大,就放松了返回的类型,但对于参数类型,仍然需要严格一致,否则会造成很多代价,这个在&13.8中有提及;对于遮蔽"派生类中的名称将遮蔽基类中具有相同名称的任何对象或函数"


重载

重载也是C++非常重要的技术之一了……(当然也由此产生了各种黑科技,比如有人重载'<'然后就会产生很多邪恶的代码)……这里主要通过一个复数运算的案例介绍了重载函数的好处,其实作者主要想说,对于重载的实现,只需要做极小的修改就可以做到,因此这个特征是好的,而且可以减少很多重复的定义。
重载一般有两种,全局的(利用优元函数)与重载成员函数;这里主要的区别是

声明时的区别 对于全局重载,本书中的复数例子便采用这种方式,作者认为这样可以减少对内部类型double的修改。 对于优元重载,这样可以定义一些对称式的函数,保证第一个值左值不发生转换;更加适用于+,=+,=*等方式。


引用&常量&存储管理

这里的内容比较简单,多是一些历史性的叙述,在p77页中左值和右值中有一个很巧妙的关于引用以及运算符[]重载的例子,可以仔细看一下,了解其是如何使用一个辅助性的数据结构来保证对此运算符实现读写都有这相同语义的。,存储管理就介绍了new标识符的出现以及其与malloc之间的关系。


在写完这个的时候,我已经差不多看完了这本书,深感作者的知识渊博,C++确实是一门很容易入门却很难精通的语言,有时候会发现里面有些东西我还不是很理解,但有种似曾相识的感觉,作者举得例子都非常基础,但却包含了很多的意义,真的值得学习,继续努力~



Previous     Next
SureD /
Published under (CC) BY-NC-SA in categories programming language  tagged with c++ 
分享到: 更多
>