读书笔记 |Google C++编程风格指南


读书笔记 |Google C++编程风格指南

一、背景


各一个C++程序员都懂,C++具有许多雄的语言特色,但这种劲不可避免的造成其的错综复杂,这种复杂会叫代码更易于出现bug、难于阅读与保护。

论指南的目的是经过详细阐述于C++编码时如果什么样形容、不要争写来逃避其复杂。这些规则可当兴代码有效运用C++语言特性的以如果其轻管理。

二、头文件


2.1 #define保护

  • 目的:防止头文件于多重复包含
  • 原型:

#ifndef  XXX_XXX_H
#define XXX_XXX_H
...
#endif //XXX_XXX_H

2.2 能依靠声明的尽管毫无借助定义

运用前置声明,尽量少.h文件被#include的多少,防止因

2.3 内联函数

  • 除非当函数少于10实行还更少时,才定义也内联函数
  • 函数声明也内联,编译器直接以调用处展开代码,节省成本
  • 析构函数不应当内联,析构函数往往比较该表面看起如丰富
  • 不要内联那些饱含循环、switch语句的函数
    • 只有大多数景下,循环和switch从不执行
  • 虚函数和递归函数即使被声称也内联函数,实际上他无必然让执行

2.4 函数参数顺序

  • 输入参数在前头,输出参数在继
  • 输入参数一般为:值 或 常数引用
  • 出口参数一般为: 非常累指针
  • 好处:
    • 增强可读性和易维护性
    • 对函数参数的堆栈空间来微小影响

2.5 包含文件之次
  C库 > C++库 > 其他库的h > 项目外之h

三、作用域


3.1 命名空间

  • 定义

    • 将全局作用域分为不同的、具名的作用域
    • 提防全局意图域命名冲突
  • 优点

    • 提供了不过嵌套的命名轴线
    • 命名轴线功能去
      • project1 : : Foo
      • project2 : : Foo
  • 缺点
      于头文件中采用未署的半空中容易违背C++的绝无仅有定义规则

  • 结论:基于上下文合理施用命名空间

    • .cc文件允许甚至发起不署名命名空间
      • .cc文件包含重复多、更扑朔迷离的底细
      • 发出针对其余命名空间中类的援
    • .h不要采用无署命名空间

3.2 嵌套类

  • 决不把嵌套类定义也public,除非他们是接口的均等有
  • 绝好以嵌套类的声明置于命名空间受到

3.3 非成员函数 / 静态成员函数 / 全局函数

  • 行使命名空间被的非成员函数/静态成员函数
  • 尽可能不采取全局函数
  • 更好之章程是:将不、静作为新类的积极分子
  • 假设单独为了封装,将不相干的函数放在同,那还是用命名空间

3.4 局部变量

  • 尽量置于最小作用域,最好声明变量时即初始化
  • 扬言与第一涂鸦用位置更走近越好
  • for(int i = 0; i < 10; ++i)
    • gcc可正确履行,其他for循环重用第一次于巡回定义的i

3.5 全局变量

  • class类型全局变量是为禁的
  • 搭类型的全局变量是允许的,但以要三思念
  • 多线程代码中很累全局变量也是叫禁止的

四、C++类


4.1 构造函数的任务

  • 职责:只进行无实际意义的初始化
  • 有含义的多少用init方法实现
  • 缺点:
    • 是的捕获错误,不可知运用大
    • 操作失败会导致对象初始化失败,引起不确定状态
  • 对单参数的构造函数使用C++关键字explicit
    • 单参数构造函数必须是显然的
    • 拷贝构造函数大多数气象也要是声明explicit
      不同:特意作为任何类的晶莹包装器的类似
    • 不准以拷贝构造函数和赋值操作的巨大

4.2 结构体和类
无非当只有发数量经常采用struct,其他一律以class

4.3 继承

  • 动组合通常较使用持续又当
  • 要是下持续,只行使国有继承
  • 有着继续必须是public,想私有继承的话,应以包含基类实例的计取代
  • 要此类有虚函数,其析构函数也应当为虚函数
  • 派生类重定义基类的虚函数时,该派生类函数夜莺声明也virtual函数

4.4 多双重继承

  • 下场景:
      只发到多一个基类中蕴藏实现,其他基类都是纯接口类
  • 优点:
      相比单继承,可复用更多代码

4.5 接口

  • 急需满足的尺度:
    • 一味生纯虚函数和静态函数
    • 尚无非静态成员函数
    • 从来不概念任何构造函数
  • 须为底声明虚析构函数
    • 担保接口的装有实现而给科学销毁
    • 这时,该虚析构函数也也纯虚函数

4.6 操作符重载
  一般情况下非苟重载操作符

4.7 存取控制

  • 即get/set函数
  • 存取函数一般内联在头文件中

4.8 Summary

  • 切莫在构造函数中做最好多跟逻辑相关的初始化
  • 编译器默认提供的构造函数不见面针对变量进行初始化
  • 子类重载的虚函数也使声明virtual关键字

五、智能指针和另外C++特性


  • 智能指针安全第一,方便第二,尽可能局部化
    • 一般用scoped_ptr
    • 其余动静下不用auto_ptr
    • 对stl容器对象,使用shared_ptr
  • 引用形参加上const,否则用指针形参
    • 避免丑代码:(*ptr)++
    • 对此拷贝构造函数,const是必的
  • 函数重载的使用如清晰/易读
  • 掉用缺省函数参数
  • 禁止使用变长数组和alloca
  • 客观采取友元
  • 慎用好
  • 行使C++风格的类型转换,除单元测试外不要使用dynamic_cast
  • 可知为此前置自增/减,不用后置自增/减
    • 内置自增效率更强,后置自增自减要针对性变量值i进行逐项拷贝
    • 假若i是迭代器或者其他非数值类型,一定要为此前置
  • const能就此则就此,提倡const在前方
    • const变量/函数/参数,会吗编译时类型检测长了平等重合保障
  • 尽量避免使用宏(c++中)
    • 尽量为内联函数、枚举、常量代替的
    • 无须在头文件中定义宏
  • 整数用0,实数0.0,指正NULL,字符串‘\0’
  • 推荐用sizeof(varname)代替sizeof(type)
  • 不过行使Boost中给认同的堆栈

六、命名约定


  • 绝不随便缩写,除非常用约定俗成的缩写
  • 函数称呼而适度为动词,其他命名使用名词
  • 漫大写+下划线: 宏/枚举
  • 均小写+下划线: 变量(含类变量/结构体变量)、文件、命名空间、存取函数
  • 大大小小写混合: 函数/类型(类/结构体/枚举)/常量

七、思维导图笔记


Paste_Image.png

大图