天天看点

google代码规范

1. 构造函数的职责

构造函数中只进行那些没有实际意义的初始化,如果对象需要有意义的初始化,考虑使用另外的Init()方法并(或)增加一个成员标

记用于指示对象是否已经初始化成功。

2. 默认构造函数

如果一个类定义了若干成员变量又没有其他构造函数,需要定义一个默认构造函数(没有参数),否则编译器将自动生成默认构造函数。

3. 明确的构造函数

对单参数构造函数使用 C++关键字 explicit。

只有一个参数的构造函数可被用于转换(隐式转换生成一个新的对象),为避免构造函数被调用造成隐式转换,可以将其声明

为explicit。

4.结构体和类

仅当只有数据时使用struct,其它一概使用class。

5.继承 

使用组合通常比使用继承更适宜,如果使用继承的话,只使用公共继承。

实现继承通过原封不动的重用基类代码减少了代码量,接口继承可用于程序上增强类的特定API的功能。

限定仅在子类访问的成员函数为protected,需要注意的是数据成员应始终为私有。

当重定义派生的虚函数时,在派生类中明确声明其为virtual。根本原因:如果遗漏virtual,阅读者需要检索类的所有祖先以确定该函数是否为虚函数。

6.多重继承

只有当最多一个基类中含有实现,其他基类都是以Interface为后缀的纯接口类时才会使用多重继承。

多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。

7.接口

纯接口:

1) 只有纯虚函数("=0")和静态函数(下文提到的析构函数除外);

2) 没有非静态数据成员;

3) 没有定义任何构造函数。如果有,也不含参数,并且为protected;

4) 如果是子类,也只能继承满足上述条件并以Interface为后缀的类。

8. 操作符重载

一般不要重载操作符,尤其是赋值操作(operator=)比较阴险,应避免重载。如果需要的话,可以定义类似Equals()、CopyFrom()等函数。

9.存取控制

将数据成员私有化,并提供相关存取函数,如定义变量foo_及取值函数 foo()、赋值函数set_foo()。

存取函数的定义一般内联在头文件中。

10.声明次序

定义次序如下: 

public:

protected:

private:

11.编写短小函数

函数尽量短小、简单,便于他人阅读和修改代码。

如果函数超过40行,可以考虑在不影响程序结构的情况下将其分割一下