1、类的代码风格
- 类访问控制块的声明依次序是 public:, protected:, private:,缩进和 class 关键字对齐
class MyClass : public BaseClass {
public: // 注意没有缩进
MyClass(); // 标准的4空格缩进
explicit MyClass(int var);
~MyClass() {}
void SomeFunction();
void SomeFunctionThatDoesNothing()
{
}
void SetVar(int var) { someVar = var; }
int GetVar() const { return someVar; }
private:
bool SomeInternalFunction();
int someVar;
int someOtherVar;
};
- 构造函数初始化列表放在同一行或按四格缩进并排多行
// 如果所有变量能放在同一行:
MyClass::MyClass(int var) : someVar(var)
{
DoSomething();
}
// 如果不能放在同一行,
// 必须置于冒号后, 并缩进4个空格
MyClass::MyClass(int var)
: someVar(var), someOtherVar(var + 1) // Good: 逗号后面留有空格
{
DoSomething();
}
// 如果初始化列表需要置于多行, 需要逐行对齐
MyClass::MyClass(int var)
: someVar(var), // 缩进4个空格
someOtherVar(var + 1)
{
DoSomething();
}
- 使用命名空间来限定作用域
namespace Switcher {
class Packet {
...
}
void SendPacket(const Packet& packet);
}
namespace Router {
class Packet{
...
}
void SendPacket(const Packet& packet);
}
全局变量、全局常量、全局类型定义由于都属于全局作用域,在项目中使用第三方库容易出现冲突,命名空间将作用域细分为独立的具名的作用域,可有效防止全局作用域的命名冲突。
2、构造函数、析构函数、复制构造函数、赋值运算操作符
- 类的成员变量必须显式初始化
- 成员变量优先使用声明时初始化(C++11)和构造函数初始化列表初始化
- 为避免隐式转换,将单参数构造函数声明为explicit
class Foo {
public:
explicit Foo(const string& name): name(name)
{
}
private:
string name;
};
v