最近听了别人的安利,对Think in C++这本书产生了一定的兴趣,刚开始读的时候,觉得甚是晦涩,因为它满篇的专业名词让我无所适从。但是庆幸的是,度过了第一章之后,后边的内容便变得平易近人,细细读来发现确实写的非常的精彩。在第一遍读完之后,觉得读的不是很细致,于是反过头又读一遍,觉得确实错过了很多东西。如今是第三遍翻到开头的部分,决心将它再读一遍。并且这次想要把读的时候想到的读到的一些有意思的东西记录下来,也希望能帮到一些人,更希望自己在之后看到自己当时所写,会有更深的理解和感触。
这本书的第一章,可以算是对它两卷书所有内容的总结概括,信息量还是非常大的。首先,在这一章中,介绍了面向对象的基本概念。在我看来,面向对象,可以说是对脑力的一个解放,它将之前一直困扰着程序员的按照计算机的结构去思考问题,一举简化成为按照要解决的问题去思考问题,从某种程度上省去了程序员耗费在将实际问题转化为计算机模型中问题的脑力,降低了开发要求和开发成本。在实际写程序时最直观的感受就是面向过程的C语言大多忙于按照机器的思路去构造一个函数来解决某些问题,而C++则是引入对象的概念,如果是对象的使用者,则只用考虑如何去如何利用这个对象以及它的特性去做一些事情,而不是沿着机器的思路去思考它。而如果是对象的创建者,则只用考虑去如何描述一个实际的东西以及它的功能。也就是说,面向对象更加贴近于“如何解决一个问题”而不是“如何使用计算机”。可以说这是前人不断努力封装才得到的东西。
说到封装,C++是一个十分注重封装的语言。可以说,封装能力代表了代码有可能的复用能力,每一个经过深思熟虑和细心调试的代码块,都可以被当做一个整体封装起来,拿到别的地方去使用,这一点C++做的相当出色,因为它包含有详细的边界控制和多种代码复用的方法。对于一类对象或者实例,它们可以被描述为一个类,一个类具有其相应的接口以及内部数据,而C++在类的构建者和用户之间筑起了一堵高高的墙,即类的创建者可以自己控制类中数据及方法的显隐性,创建者可能不希望它的用户修改其中一些重要的东西,不希望其调用其中的一些函数方法,希望它们可以完全由自己掌控。而且这堵墙后边的实现方法其实也与用户毫无关系,用户只需要知道怎么去使用创建者留给自己的接口就好,这样一旦创建者对自己的类进行改进的时候,也可以减少使用者代码的修改量甚至使用者根本不需要更新代码。
关于代码的复用性,C++当中提供了很多种方法,首先通过一个类去构建多个相同类型的不同对象可以勉强当做是一种代码的复用。而如果将他人封装好的类生成对象嵌入到自己的类当中,即成员对象,也算得上是一种很好的代码复用。自然还有一种便是直接对他人封装好的类进行继承,我觉得扩展这个词可能比继承更为形象一点,就是通过改变或者增加或者减少基类的接口,来形成一个派生类,这个派生类则可以更好的去适应更为实际的问题,同时又不必为每一个派生类去单独设计所有代码,其中基础的部分可以进行封装并单独维护。而C++的虚函数及一些特性则会保证基类以及派生类之间相互转换,调用时的一些问题,详细的会在靠后的章节中来专门讲,这里不再赘述。
根据书中提到的Alan Kay对第一个成功的面向对象语言Smalltalk的总结,即1.万物皆对象 2.程序就是一组对象,对象之间相互通信通知做什么 3.每个对象都有自己的由其他对象构成的存储区 4.每个对象都有一个类型 5.一个特定类型的所有对象都能接收相同的消息。这些描述也符合C++当中对象的特点,可以说总结的非常的精炼。而在C++当中,类最原本的概念也就是将函数作为成员整合到struct当中去,使其不仅包含数据成员,同时包含成员函数,以构成最面向对象当中最基本的类。数据成员作为对象的描述,而成员函数也充当对象的接口,以及对象内部的运作工具。
总而言之,C++提供了一套完整而且又易于使用的面向对象体系,在这个体系当中我们可以尽力去研究我们需要解决的问题的本身,而不必花费太多脑力去将其转换为计算机的思路。虽然C++相较于C语言做了很多的封装,而且也提供了更丰富的库,但是在实际使用当中C++代码的运行性能并不逊色于C语言,这可能也是C++最为可贵的地方,而且相较于C语言代码,用书中的原话:一个写的好的C++程序一般比等价的C程序简单的多和更容易理解。而且根据我自己的感受来看,熟练的掌握C++当中的标准函数库将会给代码的开发带来前所未有的便利。最后,再次翻开这本书,便向C++又迈进了一步,参透一门语言的思想远比学会怎么去用它难得多,我想我还欠些火候。