《高质量C++/C编程指南》陷阱 【转】

作者:幻の上帝

出处:

此文硬伤不少,且相对谭XX的书而言隐晦许多,不建议新手学习。主观的论述,合理的部分,就此略过。疏漏之处也尽量忍住不吐槽。第1章文件结构

每个C++/C程序通常分为两个文件。

//错误。没有强调翻译单元的概念。

另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。

//有误。实现不简单等同于定义。例如,类的完整声明也是类的定义,但不是完整的实现。头文件也可以存放其它定义(例如模板和内联函数的实现)。

1.2建议1-2-1

在C++语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。

//这条建议一般不适用于类模板。

1.4

头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

//在使用合理的情况下,这基本上是正确的,但头文件可以导致其它方面——像重构(典型情况如重命名一个函数)的复杂化。

第2章程序的版式这章基本是主观内容。读者需要注意风格是有争议的,其中的“良好风格”或“不良风格”并非公认。2.8很多C++教课书受到BiarneStroustrup第一本著作的影响,不知不觉地采用了“以数据为中心”的书写方式,并不见得有多少道理。

我建议读者采用“以行为为中心”的书写方式,即首先考虑类应该提供什么样的函数。这是很多人的经验——“这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员!”

//“BiarneStroustrup”拼写错误。C++之父的名字是BjarneStroustrup。有些一厢情愿了:C++的类定义中既然允许显式地表示private成员,就不是纯粹的接口描述方式。以我个人的经验,数据成员写在后面可能会导致顺序阅读代码时需要回溯。当类定义长度较小时这点影响不大,但定义长度比较长的时候(例如Loki::Functor里的代码)就会需要较频繁地滚屏,影响代码阅读效率。

第3章命名规则这章也基本是主观内容。3.1规则3-1-1

标识符应当直观且可以拼读,可望文知意,,不必进行“解码”。

//这点和此文建议使用的匈牙利命名法有一定程度的矛盾。

规则3-1-3

命名规则尽量与所采用的操作系统或开发工具的风格保持一致。

//尽管大部分人应该乐于支持这个观点,不过事实上有时候无法实现。例如同时使用标准库和WindowsAPI风格的代码。这时倒不妨直接约定允许根据上下文选择要使用的命名风格。要点是,应该让人看出某个名称是用哪个风格命名的,而不至于一眼就混淆来源。

3.2规则3-2-7

为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。

//在C++中应该考虑是否可以用命名空间代替前缀。

第4章表达式和基本语句

我真的发觉很多程序员用隐含错误的方式写表达式和基本语句,我自己也犯过类似的错误。

//作者似乎没搞清楚“错误”一词的语义。

4.3规则4-3-4不要写成if(p==0)//容易让人误解p是整型变量if(p!=0)

//事实上,C++中的NULL典型地就是int字面量0(考虑到成文时间,不提新标准的空指针类型),和int兼容。

4.3.5

或者改写成更加简练的return(condition?x:y);

//这里的括号是多余的。

4.4这节不是语言本身而是涉及语言实现的内容。以现在的观点来看,优化器会可能会在此做一些工作。当然了解一些相关原理大体上还是有益的。第5章常量

常量是一种标识符,它的值在运行期间恒定不变。C语言用#define来定义常量(称为宏常量)。C++语言除了#define外还可以用const来定义常量(称为const常量)。

//谭XX风格的信口开河。这段引文中逗号或者句号之间的内容,没一个能算得上是正确的。

5.2规则5-2-1

在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

//这是有问题的。事实上很多情况下const只能让编译器被修饰的对象当做只读变量,而非编译期的真正意义的常量进行处理。与#define的符号常量(字面量)相比,只读变量受到了一些限制,例如不能作case的标号。

第6章函数设计

C语言中,函数的参数和返回值的传递方式有两种:值传递(passbyvalue)和指针传递(passbypointer)。

//错误。形式上,C语言函数参数只按值传递。所谓的指针传递是按值传递的一种,只是传递参数的类型是指针而已。

6.1规则6-1-1

参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。

旅游不在乎终点,而是在意途中的人和事还有那些美好的记忆和景色。

《高质量C++/C编程指南》陷阱 【转】

相关文章:

你感兴趣的文章:

标签云: