一、头文件
1.#define的保护
为防止头文件被多重包含,应使用:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif
2.内联函数
注意:对于析构函数应慎重对待,析构函数往往比其表面看起来要长,因为有一些隐式成员和基类析构函数(如果有的话)被调用!
3.函数参数顺序(Function Parameter Ordering)
定义函数时,通常参数顺序为:输入参数在前,输出参数在后。
二、作用域
1.命名空间(Namespace)
在 .cpp 文件中,提倡使用不具名的命名空间(unnamed namespaces),但是,不具名空间容易违背C++的唯一定义原则(One Definition Rule(ODR))。应视情况选择使用。
1)不具名命名空间(Unamed Namespaces)
可避免运行时的命名冲突:
//.cpp文件
namespace{
//命名空间的内容无需缩进
enum{EOF};
bool AtEof(){return pos_==EOF;} //使用本命名空间内的符号EOF
} //namespace
2)具名命名空间(Namee Namespaces)
//.h文件
namespace mynamespace{
//所有声明都置于命名空间中
//注意不要使用缩进
class MyClass{
public:
...
void Foo();
};
} //namespace mynamespace
// .cpp文件
namespace mynamespace{
//函数定义都置于命名空间中
void MyClass::Foo(){
...
}
} //namespace mynamespace
另外,最好不要使用using指示符,以保证命名空间下的所有名称都可以正常使用。
// 禁止——污染命名空间
using namespace foo;
命名空间别名:
namespace fbx = ::foo::bar::baz;
2.非成员函数
有时,不把函数限定在类的实体中是有益的,甚至需要这么做,要么作为静态成员,要么作为非成员函数。非成员函数不应依赖于外部变量,并尽量置于某个命名空间中。相比单纯为了封装若干不共享任何静态数据的静态成员函数而创建类,不如使用命名空间。