【Effective C++笔记】让自己习惯C++

来源:互联网 发布:粒子群优化算法优缺点 编辑:程序博客网 时间:2024/05/21 09:25

以前看Effective C++的时候总感觉写的很晦涩,里面说到的条款好像没太大作用,现在重新翻看瞬时觉得以前的想法不免幼稚可笑,不得不承认里面还是有很多值得遵守的使用习惯,从另外一个角度来说它并不适合C++的初学者,更适合有一定C++使用经验的开发者。当然书中说的有些东西体会的并不是特别深刻,但没关系,可以先总结下来以后再重新查看,把书读薄。这个系列组织的方式会严格按照书里面的章节来分,每章除了会摘录书上的精华,会适当地加上一些自己的理解。这本书有一个很有意思的地方是以条款的形式来说明,看上去有点像法律法规之类的东西,我们经常会看到一些引用说来自这本书的条款XXX,有强迫症的同学可以把所有条款都背下来:-)


【条款01】视C++为一个语言联邦

联邦对应的英文单词是federation,可以理解为一个大的集合。是的,C++就是一个大的语言特性的集合。严格来说,C++是个多重范式编程语言(面向过程、面向对象、函数式、泛型形式)。面向过程的代表是C语言,有人也说C++是C语言的一个超级,C++的设计基本上是以C语言为基础的;面向对象的代表是Java,抽象、继承、封装、多态皆在C++中有所体现;函数式编程的代表是Haskell,还有现在比较火的Erlang,由于本人尚未在项目中使用过C++的函数式特性,所以不便发表意见,据说C++11包含了大量函数式特性,如lambda运算,有兴趣的可以去实践下;泛型编程应该是C++比较独特的语法特性,大家用的比较多的STL中有大量的template实现。

C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。


【条款02】尽量以const,enum,inline替换#define

宏定义并不是一个很好的东西,你可以想象各种宏定义遍布的代码,可读性大打折扣。另外,使用不当也会造成很多麻烦,相信很多人都有过很多头疼的经历。

Meyers建议尽量用const、enum、inline来替换宏定义,对于单纯常量,最好以const对象或enums替换#defines;对于形似函数的宏(macros),最好改用inline函数替换#defines。


【条款03】尽可能使用const

将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。

当const和non-const成员函数有着等值等价的实现时,令non-const版本调用const版本可避免代码重复。


【条款04】确定对象被使用前已先被初始化

有句经典的词是这么说来着,resource acquisition is initialization(RAII),即资源获取就是初始化,说的就是这个意思。

为内置对象进行手工初始化,因为C++不保证初始化它们。

构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。

为免除“跨编译单元之初始化次序”问题,请以local static对象(函数内的static对象)替换non-local static对象(该对象是global或是位于namespace作用域内,抑或在class内或file作用域内被声明为static)。(singleton模式的一个常见实现手法)因为C++对“定义于不同的编译单元的non-local static对象“的初始化相对次序并无明确定义。原因:决定它们的初始化次序相当困难,非常困难,根本无解。在其最常见形式,也就是多个编译单元内的non-local static对象经由”模板隐式具现化,implicit template instantiations“形成(而后者自己可能也是经由”模板隐式具现化“形成),不但不可能决定正确的初始化次序,甚至往往不值得寻找”可决定正确次序“的特殊情况。


参考:Effective C++:改善程序与设计的55个具体做法(第三版) Scott Meyers著 侯捷译

0 0
原创粉丝点击