第1章 命名原则
1.类型名:每个英文单词的第一个字母大写,其他小写,最后以_T结尾。
class PageCode_T
{
//...
};
原因:
- 防止与变量名冲突
- 使得类型名更加清晰
- 区分名字中各单词也可以用下划线
- 缩写字当作普通字处理
- 因为namespace是表示一个逻辑组,与class和enum的某些用法类似,所以采用同样的命名原则
1.2 关于变量和函数名:首字母小写,其后每个单词的第一个字母大写。
int lengthAndWidth(void) const;
1.3 全大写的函数名(建议):调用普通函数的函数
- 阅读简洁
- 跟原函数只有大小写的区别
- 效率高,可用inline方式实现这类函数
1.4关于宏,常量和模板名:全部大写,如有多个单词,用下划线分隔。
#define PI 3.1415926
enum{BLUE,RED,WHITE};
template<class TYPE>
class List_T
{
//...
};
1.5关于指针标识符名:建议以p开头或以Ptr结尾
char *pName;
1.6关于变量名前缀:
i_ 类内数据成员 instance scope
c_ 类内静态数据成员 class scope
g_ 全局变量 global scope
f_ 文件作用域变量 file scope
1.7减少匿名命名空间级标识符:可以归类放在某个命名空间、类或函数中
原因:
- 明显减少命名冲突
- 归类后使用更清晰
- 缩短生命周期
1.8名字要本着清楚、简单的原则:帮助对代码的理解
int returnStatus;
int alarmNumber;
1.9关于函数的左值和右值参数名:用lhs做左值参数的名字,用rhs做右值参数的名字
int operator=(String const &lhs,String const &rhs);
第2章 类型的使用
1.避免隐式声明类型
main(); //int main(void)
void foo(const aValue); //void foo(const int aValue);
2.慎用无符号类型:不同的C++标准中有符号和无符号的转换规则不同
3.少用浮点数除非必须
- 浮点数不精确
- 浮点数的异常处理复杂
- 运算速度慢
4.用typedef简化程序中的复杂语法
5.少用union
6.慎用位操作
- 效率低下
- 可能带来兼容性问题
7.用enum取代常量
- 易于维护
- 比#define或 int const更安全
- 在类中使用更方便
- 减少匿名命名空间级变量、常量、宏及函数
8.使用内置bool类型:只有true和false
9.尽量用引用取代指针
- 被引用的对象永远不可能是空
- 引用某一个对象后不会再去引用其他对象
- 某些operator函数的返回值
- 函数的参数传递
第3章 函数
1.函数原型声明放在一个头文件中
2.函数无参数一定要用void标注
3.对于内置类型参数应传值
4.对于非内置类型参数应传递引用或指针
- 不用拷贝
- 不用构造和析构
- 有利于非内置类型的扩充
- 有利于函数支持派生类
5.何时用指针传递参数:取舍的关键是:NULL是否是一个合法的取值
- 函数内部将自己的参数以指针形式传给其他的函数
- 若参数是被new出来的,且将要在函数内被释放
6.避免使用参数不确定的函数:可以使用重载和链式函数
7.若不得不使用参数不确定的函数,用<stdarg.h>提供的方法
va_list
va_start
va_end
8.避免函数的参数过多
9.尽量保持函数只有一个出口
10.(非void)任何情况都要有返回值
11.返回指针类型的函数应该用NULL表示失败
12.禁止成员函数返回成员(可读写)的引用或指针
13.重复使用的code用function代替
14.虚友元函数:把友元函数定义成虚函数,子类继承该友元接口而无需重复声明友元