C++初学者谈几点体会

[已注销]
2013-02-24 看过
虽然多年前在本科课程中学过C++,但之后的几年里,C++主要被我用来进行简单的算法实现或者简单的学术仿真程序的编写,一直没有深入实践过“面向对象的C++”、“泛型的C++”。因此,自己还是一个彻头彻尾的C++初学者。这里从初学者的角度谈谈读了这本书以后对C++的几点新理解新体会。

1,C++追求程序执行的效率,因而牺牲了一些编程开发的便利性。

书中好几个例子提到了这一点。比如,C++类中的方法都是默认non-virtual的。virtual函数会造成额外的开销,空间上要增加Virtual Table和指针,时间上需要通过函数指针查询正确的函数,增加了函数调用时间(条款7)。而Java中,则默认所有函数都是virtual的。又比如,函数的缺省参数值采用了静态绑定的方法,无需运行时动态决定,这就导致了如果在derived class覆盖了base class的缺省参数值,实际上是无法通过base class的指针使用覆盖后的缺省参数值的(条款37)。另外还有垃圾回收机制,很多现代的编程语言都支持,但是C++里却没有强制编译器实现垃圾回收功能。

2,C++允许程序员控制底层资源的操作,有灵活性也带来风险。

C++中争议最大的部分之一就是指针了,通过指针,程序员可以灵活的控制资源的使用,定制自己的new和delete(条款49-52),但是也带来了内存泄漏的风险(条款13)。书中很多内容,都涉及如何正确的维护资源。作者提倡用对象管理资源,例如使用智能指针,将资源用auto_ptr或者shared_ptr包装后,利用智能指针自动释放内存。

3,面向对象守则要求数据应该尽可能的封装。

public意味着不封装,不封装意味着不可改变。
通过对数据成员的隐藏,只暴露读写的接口,我们可以方便的实现各种访问控制,只读、只写、读写、无读写;同时也方便以后替换具体的计算细节(条款22)。
通过对成员函数的隐藏,在相同的namespace中以non-member代替member函数,提供对类进行操作的便利函数,可以更方便的扩展程序库(条款23)。

4,遵守面向对象设计的基本原则。

设计class犹如设计新type,首先必须要有充足的这个新class存在的理由(条款19)。另外class之间关系的设计要遵守基本的逻辑。例如,public继承意味着is-a的关系(条款32);通过复合关系塑模出has-a关系(条款38);通过private继承跟据已有的类实现出新类(条款39)。
区分要继承的是接口还是实现(条款34)。一般而言,pure virtual是提供继承的接口,non-pure virtual是为了提供缺省实现,而non-virtual则是给derived class的一份强制性实现。
虽然多重继承在很多地方不被提倡,书中也提供了一个合理的需要多重继承的逻辑的例子(条款49)。

5,时刻注意程序是否异常安全

一段平淡无奇的代码,粗看上去似乎逻辑正确,但是如果考虑到其中可能发生的异常,也许会完全颠覆你的世界观。异常常常来源于不成功的资源申请,遇到有new的地方就要想想如果new不成功会怎样。书中通过非常简练而精彩的例子讲解了一些保证异常安全性的方法(条款11,17)。

6,了解C++的template metaprogram

新的C++11应该对template metaprogram有更好的支持。本书中也提供了一个C++编译期计算阶乘的例子(条款48)。

最后总结一下,作为了解C++基本语法,但是缺乏实践经验的初学者,我觉得这本书还是很有阅读的价值的,能够加深自己对C++的理解,也看到真正要做到“精通”C++还有多少距离。

PS:C++11中,作者提到的Boost库中的很多理念已经被吸收到标准中了(条款55),C++11是一个更为强大,集合了各种编程范式,和老版相比大大降低了代码编写量的新标准。而作者也在准备针对C++11的新版,期待中。
17 有用
1 没用
Effective C++ Effective C++ 9.5分

查看更多豆瓣高分好书

评论 0条

添加回应

Effective C++的更多书评

推荐Effective C++的豆列

了解更多图书信息

豆瓣
免费下载 iOS / Android 版客户端