带有内部链接的定义限制在单个的编译单元中,则不能影响其他的编译单元,除非把它放在一个头文件中。这样的定义可以存在于.c文件的文件作用域内,不会影响全局(符号)名字空间。
在链接时,带有外部链接的定义可以用来解析其他编译单元中未定义的符号。绝大多数情况下,把这样的定义放在头文件中是一个程序设计错误。
typedef声明只是类型的别名,并不提供额外的编译时类型的安全。
在开发期间用assert语句可以有效地发现代码错误,不会影响程序的规模和在产品版本中的运行时性能。
在本书中我们采用以下风格惯例:
类型标识名以大写字母开头。
函数和数据以小写字母开头。
多词标识名的第二个及以后的词首字母大写。
常量和宏指令都用大写字母(用下划线分隔单词)。
类数据成员以d_为前缀,静态成员以s_为前缀。
类成员函数将按照创建、操纵和访问分类来组织。
在类定义中私有细节将放在公共接口之前(主要是为了强调它们在头文件中的存在)。
迭代器设计模式用于顺序访问某个基本对象的部件、属性和子对象。迭代器声明为该基本对象的友元,并且应该在对象所在的头文件中定义。本书中所使用的迭代器表示法是一种简洁的符合for循环的模型。
面向对象设计需要一系列丰富的逻辑符号,然而在本书中,我们只使用三种符号:
每个符号的方向(这里所示的是从左到右)应该和它的标签及所指出的隐含依赖方向保持一致。一些特殊种类的Uses-In-The-Implementation关系有一些特定名称(Uses、HasA、HoldsA和WasA),但是用来表示这些关系的符号都是一样的。
继承和分层是逻辑层次结构的两种形式。到目前为止,分层更具有通用性,常常涉及依赖于处理器的具体实现。当不能明显地认为问题中的类是一种所建议的基类时,分层,尤其是合成,比派生好。最后,为了满足若干客户端程序的需求而扩展单一类的功能,常常会导致类超重而不受欢迎。对于那些不被广泛使用的类来说,实现过于完整的功能可能增加不必要的开发时间、维护成本和代码规模。推迟还不需要的功能的实现可减少开发时间,同时预留选择实现版本的机会。另一方面,用户希望商用组件库功能完善,鲁棒性好。