读书笔记 |谷歌(Google) C++编程风格指南

五、智能指针和其余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

大图

一、背景


各种C++程序员都清楚,C++具有众多精锐的言语特色,但那种强硬不可防止的诱致它的扑朔迷离,那种复杂会使得代码更便于出现bug、难于阅读和爱抚。

本指南的目的是因此详细阐释在C++编码时要哪些写、不要怎么样写来规避其复杂。那个规则可在同意代码有效利用C++语言个性的同时使其便于管理。

读书笔记 |谷歌(Google) 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关键字