《C++语言的设计和演化》 学习笔记

来源:互联网 发布:光明至尊魅影皮肤淘宝 编辑:程序博客网 时间:2024/05/16 03:18

这本书是C++创始人写的一本书,主要介绍了C++语言的演化过程,包括C++中的众多各种特征是如何引入进来的,包括为什么要在C语言上而不是其他语言上进行改进。看了很多C++的基础书籍之后可以考虑看看这个,因为可以让你了解事情的原委。


C++之所以是这样的

                                                                             ——《C++语言的设计和演化》读书笔记(1)

 

 

       C++之所以这样,大多都源自于BjarneStroustrup在实际研究过程中所遇到的问题。正是为了解决这样那样的问题。C++才有了类,才有了与其他语言的兼容性,才有这样的速度。

       “类的概念使我能把应用中的概念直接映射到语言结构,是我的代码比我见过的其它任何语言的代码更具可读性”。是的,正是因为有这样诱人的特点,所有没有理由不把这种特性加到新的语言中去啊。这个优点在开发大型系统的时候显得尤为突出。

       java相比,C++看起来不是完全的面向对象。在C++,我们还是能发现大量过程化语言的踪迹。这是为什么呢?在网上可以找到很多答案:为了与C兼容。是的,确实是为了与C兼容,但还有别的,那就是C++之父的个人思想——兼容性。“我绝不想通过一种有局限性的程序设计语言定义区推行某种唯一的设计理念。人们思维的方式是如此的丰富多彩,企图推行一种单一理念总是弊多于利。这样,C++被有意地设计成能够支持各种各样的风格,而不是强调‘一条真理之路’”。坚持着这样的信念,C++自然就变成了能够兼容其它语言的语言,不仅兼容上述的C语言,而且还兼容汇编等其它语言。兼容的好处就在于你可以用特定的语言解决特定的问题。在对解决某个特定问题时,可能某种语言的优势是非常明显的,那么我有什么理由不去用这种语言呢?可能的答案只剩下一个:可维护性。这是一个问题。但有时在特别需要效率或者其它什么优势特点的时候,可维护性往往只好降低它的重要级别了。

       可移植性也是Bjarne包容思想的一个体现。因此现在C++的可移植性是毋庸置疑的。从Unix、Linux到Windows,以及各式各样的嵌入式的开发中,我们都能看到C++的身影。

 

 

 

智者的眼光  

                                                       ——《C++语言的设计和演化》读书笔记(2)

 

   我不得不佩服Stroustrup充满睿智的头脑:在80年代初,就设计出了那么多现代C++中所具备的特征: 

           ● 类——目前几乎所有流行面向对象语言都有的元素,甚至关键字都差不多。            

           ● 派生类(继承的体现,哪一个面向对象语言不具备继承的性质呢?) 

           ● 公用/私用的访问控制(目前流行面向对象语言都具备的特征) 

           ● 构造函数和析构函数(也是目前流行面向对象语言都具备的特征) 

           ● 友员、内联、运算符重载(C++中不是经常遇到吗?别的语言不知道)

       这些特征,在现在看起来是那么的平常,在任何一本介绍C++面向对象的书中都能查到,但在当时,我想是没有什么现成的可以参考的,有的可能就是早期的那些语言,也许有只言片语可以借鉴,但更多的是透过Stroustrup那富有灵气的头脑通过反复地实践探索出来的。他的设计是如此富有远见以至于到现在,我们所使用的语言中,处处都透着当年设计的气息。

       Stroustrup的眼光还在于准确的把握了市场的需求,使得带类的C以及后来的C++能够比较快的被人们接受,广泛流传。首先,他知道拉拢甚至极力讨好C用户,因为当时有很多人用C,而且由于C的许多特性如C的灵活性、高效性、可用性以及可移植性使得Stroustrup决定在C的基础上加以扩充。这样,不仅C用户会比较容易接受,其他用户看到即有C的优点,又结合如Simula、Smalltalk等其他语言的优势后,也会转向使用带类的C的队伍中来。其次,他没有忘记在开拓语言优势的同时,保留原来一些语言的优点,只有这样,才有可能说服原来用惯了高效灵活的C的用户转而投奔到带类的C以及C++的怀抱中来。他没有把C++设计成一个完美的语言,而是尽量是语言贴近实际的应用,以完成实际项目为目的。

 

ps:第一章看起来还比较舒服,可第二章看起来怎么那么不顺呢?似乎裘老师翻译的某些关键字的适用性还有待商榷,比如inline(翻译成'在线')、constructor(翻译成'建构函数')等。

 

从C到C++  

                                                                —《C++语言的设计和演化》读书笔记(3) 

 

 

     不能说哪种语言取代了哪种语言,只是一种新语言的出现必然伴随着她的新的特征。从C到带类的C,再到C++,逐渐形成了一些新的语言特征:

    1.虚函数

     让C++高度抽象成为现实。也就是说我们不必关心派生类真正要去做的是什么事情,我们在父类中只定义了函数接口,把具体实现延迟到派生类中。这样做的好处是显而易见的,就像书中提到的一个例子:父类中定义了一个接口draw(),以后不管派生类要怎么“画”,只要在派生类内部定义了draw(),指定了自己“画”的行为,就可以沿着继承的层次关系找到派生类的draw(),尽管表面上看是调用父类的draw()。这样就能通过使用虚函数实现模块化。坏处就是使编译器的实现越来越困难了,其生成的代码也会变的相对庞大,以及效率上的影响。

    2.重载

     重载让语言变的简洁。一是使一些有相同含义的函数可以以相同的名字出现,区别就在于参数和返回类型;二是使用户自定义类型可以模拟内建类型的操作方式。在效率上,似乎对我们来说没什么影响:)

    3.常量

     尽量用const和inline而不用#define,这就是C++与C的区别。为什么要这样?我想<<Effective C++>>中条款1已经说的很清楚了。

    4.存储管理和类型检查

     这些都使得C++更加安全,<<Effective C++>>也有关于这两方面的论题。

    5.声明语句

     我觉得这是一个很大的改进,尽管Bjarne认为这是次要特征。学习C语言是,总是为变量没有声明而再回到函数开头去声明变量。关键还在于对临时变量空间的回收,这点好象在林锐博士写的<<高质量C++编程指南>>中提到过。


0 0