google c++编程规范笔记手记

本文详细介绍了Google的C++编程规范,涵盖头文件、作用域与生命周期、类、函数等多个方面,强调了代码的可读性、组织性和潜在的性能优化。规范包括避免多重包含、使用匿名命名空间、避免全局变量、明确类型转换、谨慎使用运算符重载、正确使用智能指针等,旨在提高代码质量和可维护性。
摘要由CSDN通过智能技术生成

1. 头文件

  • 除了?单元测试?和只含有main函数的.cpp文件,其他.cpp都要包含.h文件
  • #ifndef …; #define H; #endif 目的是避免多重
    包含 [代码组织]
  • include [可读性, 代码维护]
    #include <PATH_AFTER_SRC>/FILE.h
    顺序:FILE.h, C系统文件, C++系统文件, 其他库的.h文件, 本项目内.h文件
    目的:方便排查程序BUG
  • 直接包含原则,只考虑当前.cpp文件直接需要的.h文件 [代码组织]
  • .cpp中函数和类的定义均使用.h,避免使用前置声明.因为前置声明隐藏了依赖
    关系 [代码组织]
  • self-contained [代码组织]

2. 作用域和生命周期

2.1 命名空间

  • 匿名命名空间 namespace {} //namespace [解耦]
    • 作用域为当前文件
    • 用于不同编译单元的解耦
    • 推荐将只在当前编译单元使用的全局变量和全局函数放在该空间内
    • 只用于.cpp文件
  • 具名命名空间 namespace NS { //不缩进} //namespace NS [代码组织]
    • 避免名字冲突
    • 可用于.h文件或.cpp文件
    • 禁止使用using namespace FOO;污染命名空间
    • 在.cc文件,.h文件的函数,方法和类中,可使用using和别名namespace fb
      = ::foo::bar::baz; [可读性]

2.2 全局/局部/静态 函数/变量

  • 全局函数和静态成员函数的作用域全局可见,若只在当前.cc文件使用,推荐使
     用匿名命名空间,避免在不同编译单元引起不必要的耦合 [解耦]
  • 具有静态生命周期的变量(全局变量,静态全局/局部/成员变量)只能使用内建类
    型,如int,float,char或对应的数组,指针,不能使用类类型.原因有2个: 1)
    全局变量全局可见,不同编译单元之间全局变量的初始化和析构顺序是未定义的,
    违反变量使用前必须初始化的原则 2)静态变量生命周期到程序结束,多线程场景
    不同线程之间同一静态对象的构造和析构顺序不确定 [潜在BUG]
  • 局部变量就近声明并定义 [可读性]

3. 类

3.1 构造函数

  • 不在构造函数中调用自身的虚函数 [潜在BUG]
    原因: 虚函数在运行时动态绑定,构造未完成时无法确定调用哪个对象(基类or子类)
  • 不在无法报出错误时进行可能失败的初始化 [潜在BUG]
    原因: 不使用异常,无法在构造函数中报错,可使用工厂函数

3.2 隐式类型转换

  • 尽可能使用explicit关键字显示表明类型转换,如类型转换运算符and单参数构造
     函数 [可读性]

3.3 可拷贝类型和可移动类型

  • 最低限度使用拷贝和移动,如非明显需要,禁用拷贝和移动 [执行效率]
    原因: 拷贝操作(拷贝构造and拷贝赋值)常隐式调用,造成对象的不必要拷贝
  • 禁用基类的拷贝和移动,否则会导致子类对象的切割 [可读性]
  • 需要拷贝时显示定义拷贝构造/拷贝赋值成员函数,移动操作同理 [可读性]

3.4 结构体and类

  • 只有数据成员时使用struct,否则使用class [可读性]

3.5 继承

  • 只有 “is-a” 关系使用继承, “has-a” 关系使用组合 [设计逻辑]
  • 必须为公有继承,原因: 不改变继承链的可见性 [设计逻辑]
  • 若类含有虚函数,则析构函数也要为虚函数 [潜在BUG]
  • 不过度使用protected关键字 [设计逻辑]
  • 数据成员必须private [设计逻辑]
  • 极少情况使用多重继承,若必须使用,则要求最多只有一个基类是非抽象类,其
     他基类为以Inter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值