谷歌开源项目风格指南笔记(上)

来源:互联网 发布:重庆知行科技学校 编辑:程序博客网 时间:2024/06/10 03:53
一 头文件
  1. self_contained 头文件
     头文件包含所有需要的头文件,且不包含不必要的头文件和符号
  2. 加define 保护,防止重复引用此头文件
      define的规则为
     #define <PROJECT>_<PATH>_<FILE>_H
  3. 前置声明可以减少头文件依赖,
      3.1尽量避免.前置声明定义在其他项目内的实体
      3.2 函数总是用#include
     3.3 类尽量用#include
 4. 函数代码小于10行使用内联函数,析构函数别用,因为析构函数内包含很多对象释放的代码。 
 5. #include 路径顺序
    5.1  dir2/foo2.h (优先位置, 详情如下)
    5.2 C 系统文件
    5.3 C++ 系统文件
    5.4 其他库的 .h 文件
    5.5 本项目内 .h 文件



二 作用域
 1)
   1. 禁止使用内联命名空间
  2. 在c文件允许甚至鼓励使用匿名命名空间
  3. 引用其他名字空间的类
namespace a { class A; }    // a::A 的前置声明
  4. 不要在命名空间std内声明任何东西
  5. 最好不要使用using 从而使得所有命名空间的内容可以正常使用
  6. 在cc文件中,函数,方法,类中可以使用using 
  2) 
class Foo {

private:
    // Bar是嵌套在Foo中的成员类
    class Bar {
        …
    };

};
   嵌套类: 只给外部类使用,防止类名污染,在.h 从前置声明,在.cc中定义
     
  3)某些情况下, 非成员函数和静态成员函数是非常有用的, 将非成员函数放在名字空间内可避免污染全局作用域.
      将非成员函数和静态成员函数作为新类的成员或许更有意义, 当它们需要访问外部资源或具有重要的依赖关系时更是如此.
  4)将变量尽可能置于最小作用域内,并在变量声明时进行初始化。
        如果变量是一个对象,每次进入作用域都要调用构造函数,每次退出作用域都要调用析构函数
   5)只允许原生数据类型(int double)的全局变量和静态变量
   6)  namespace的使用除了考虑命名污染,可读性之外,主要为了降低耦合,提高编译和执行效率



三 类
 不要在构造函数中进行复杂的初始化 (尤其是那些有可能失败或者需要调用虚函数的初始化).

  如果类中定义了成员变量, 则必须在类中为每个类提供初始化函数或定义一个构造函数. 若未声明构造函数, 则编译器会生成一个默认的构造函数, 这有可能导致某些成员未被初始化或被初始化为不恰当的值.

对单个参数的构造函数使用 C++ 关键字 explicit.
2个例外 拷贝构造函数, 作为其他类的透明包装类

如果你的类型需要, 就让它们支持拷贝 / 移动. 否则, 就把隐式产生的拷贝和移动函数禁用.

在能够减少重复代码的情况下使用委派和继承构造函数.

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

在类中使用特定的声明顺序: public: 在 private: 之前, 成员函数在数据成员 (变量) 前;

将 所有 数据成员声明为 private, 并根据需要提供相应的存取函数. 例如, 某个名为 foo_ 的变量, 其取值函数是 foo(). 还可能需要一个赋值函数 set_foo().

特例是, 静态常量数据成员 (一般写做 kFoo) 不需要是私有成员.

一般在头文件中把存取函数定义成内联函数.


四 谷歌奇技
动态分配出的对象最好有单一且固定的所有主(onwer), 且通过智能指针传递所有权(ownership).
使用 cpplint.py 检查风格错误.
0 0