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

时间:2021-10-14 08:54:29
一 头文件   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 检查风格错误.