1. 命名空间

  • KeyNotes:

    • 鼓励在.cc文件里使用匿名命名空间或者sttic声明
    • 禁止使用内联命令空间,X::Y::foo 等价与X::foo。其主要用于跨版本的ABI兼容问题
    namespace X{
    inline namespace Y{
    void foo();
    } // namespace X
    } // namespace Y
    • .h头文件使用匿名命名空间违背C++的唯一定义原则(ODR)
  • 使用建议:

    • namespace的结尾}处添加注释

    • 不要在std命名空间中声明任何东西,包括标准库类的前置声明(行为未定义)

    • 禁止使用类似using namespace foo的语句,会导致污染当前命名空间

    • 不要在头文件中使用命名空间别名,除非显示标记内部空间使用。如下是可以的:

      namespace paddle{
      namespace framework{
      using Tensor = paddle::Tensor; // 仅在当前命名空间使用 void foo(){
      using LoDTensor = paddle::LoDTensor; // 限制在一个函数内部使用
      }
      } // namespace framework
      } // namespace paddle

2. 匿名命名空间和静态变量

  • KeyNotes:

    • .cc文件中一个变量不需要被外部使用时(内部链接性),可以将其放在匿名空间或者声明为static但不要在.h文件中这么做
    • 内部链接性,意味着此函数、变量不能在另一个文件中被访问。即使两个文件中包含了完全相同的标识符,它们指向的也不一样

3. 非成员函数、静态成员函数和全局函数

  • KeyNotes:

    • 应尽力避免使用全局函数,取而代之使用静态成员函数,或者命名空间中的非成员函数(避免污染全局作用域)。
    • 定义在同一编译单元中的函数,被其他编译单元调用时,可能会引入不必要的耦合和链接依赖。静态成员函数对此尤其敏感,可以考虑提取到新类中,或置于独立库的命名空间中。
  • 使用建议:

    • 定义非成员函数,且只在.cc文件中使用,使用static关键字修饰,如:

      static void foo(int x){}

4. 静态和全局变量

  • KeyNotes:

    • 编译单元:每一个.c.cc都是一个编译单元
    • 静态生命周期变量:全局变量、静态变量、静态类成员变量和函数静态变量。
    • 同一编译单元内是明确的,静态初始化优先于动态初始化,按声明顺序进行,销毁则反着来。
    • 不同编译单元的构造和析构顺序是未定义的。
  • 使用建议:
    • 禁止定义静态存储周期非POD变量(如int/char/float类型的结构体等)。因为多编译单元下的静态变量执行时的构造和析构顺序是不明确的
    • 函数作用域里的静态变量行为是明确的,因为只会在指令执行声明时才会发生。
    • 若确实需要一个class类型的静态或者全局变量,注意只能使用raw指针别用智能指针,因为后者析构时涉及到上下文指出的不定顺序问题。
    • 当创建静态变量时,请使用C 数组const char[]分别代替 vectorstring

5. 构造函数

  • 使用建议:

    • 不要在构造函数中调用虚函数,也不要在无法报错时进行可能失败的初始化

6. 隐式转换

  • 使用建议:

    • 不要定义隐式类型转换。
    • 在转换运算符和单参数构造函数中,请使用explicit关键字。
    • 拷贝和移动构造函数不应当被标记为explicit,因为他们并不执行类型转换。
    • 若一个构造函数包含超过1个参数,不要加explicit关键字(没有意义);例外情况:除了第一个参数外其他参数都有默认值。
    • 接受一个std::initializer_list作为参数的构造器,也应该省去explicit

7. 可移动与可拷贝

  • KeyNotes:

    • 可移动及可拷贝类型对象支持值传递方式返回,不同于指针,它不会造成所有权、生命周期、可变性等方面的混乱。
  • 使用建议:

    • 不要为基类提供拷贝/赋值操作,因为在使用它们时会造成对象切割
    • 拷贝构造和赋值函数要同时给出或禁用。

8. 继承:

  • KeyNotes:

    • 继承包括实现继承接口继承:前者子类也继承了父类的实现,后者只继承了接口。
  • 使用建议:

    • 优先使用组合,而非继承。如果使用继承,请使用public
    • 不要过度使用实现继承,组合更合适一些。
    • 若类中包含虚函数,请在析构函数前面加上virtual关键字
    • 在声明重载函数时,请加上override关键字

9. 接口:

  • KeyNotes:

    • 当一个类满足如下条件时,称之为纯接口

      • 只有纯虚函数(=0)和静态函数
      • 没有非静态成员变量
      • 没有定义构造函数(若有,也不能带参数,且为protected
    • 接口不能被实例化(因为没有可调用的构造函数)

10. 运算符重载

  • KeyNotes:

    • 重载operator具有诸多弊端,如无必要,应尽量避免。
  • 使用建议:
    • 只有在意义明显,且重载行为与内建运算符一致的情况下,可以考虑重载
    • 若重载了<,请也重载>=

11. 声明顺序

  • 使用建议:

    • 将相似的声明放在一起。
    • 类的定义一般按照public:protected:private:来组织
    • 并遵循如下顺序:类型(typedefusing和嵌套的类与结构体)、常量、工厂函数、构造函数、赋值运算符、析构函数、其他函数、数据成员。

Google C++ 语言规范的更多相关文章

  1. Google JavaScript 语言规范

    变量 ▶ 声明变量必须加上 var 关键字.   常量 ▶ 常量的形式如: NAMES_LIKE_THIS, 即使用大写字符, 并用下划线分隔. 你也可用 @const 标记来指明它是一个常量. 但请 ...

  2. google的python语言规范

    Python语言规范   Lint Tip 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less ...

  3. Python 语言规范(Google)

    Python语言规范 Lint tip 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dy ...

  4. google 谷歌Python语言规范

    Python语言规范 https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_lan ...

  5. 资料推荐--Google Java编码规范

    之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然这篇文章的 ...

  6. Protocol Buffer技术详解(语言规范)

    Protocol Buffer技术详解(语言规范) 该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的 ...

  7. Google Python命名规范

    Google Python命名规范 module_name,  模块 package_name,  包 ClassName,  类 method_name,  方法 ExceptionName,    ...

  8. python公司内部语言规范与语言风格

    一.python语言规范 1.1导入 Tip: 仅对包和模块使用导入 定义: 模块间共享代码的重用机制. 优点: 命名空间管理约定十分简单.每个标识符的源都用一种一致的方式指示.x.obj 表示obj ...

  9. Google Python 命名规范

    Google Python命名规范 module_name,  模块 package_name,  包 ClassName,  类 method_name,  方法 ExceptionName,    ...

  10. c#语言规范

    0x00 分类 C#语言规范主要有两个来源,即我们熟知的ECMA规范和微软的规范.尽管C#的ECMA规范已经前后修订4次,但其内容仅仅到C# 2.0为止.所以慕容为了方便自己和各位方便查询,在此将常见 ...

随机推荐

  1. 学习Python前要了解的tips

    学习Python前要了解的tips 对后续的学习来说很重要,否则后续会出现一些奇奇怪怪的问题,而且很难找到解决方法.嘿嘿,就不要问我怎么知道的了吧,好多都是我踩过的坑 卸载电脑内软件 之前我一直用电脑 ...

  2. DNS的各种记录类型的应用解析

    可能很多人平时工作中不会遇到DNS配置相关的问题, 但如果偶尔遇到不同类型DNS记录的配置, 在没有搞清楚它们都是干啥的情况下, 会眼花缭乱, 还记得很多年前实验室配置DNS不太对导致只能访问www. ...

  3. #欧拉序,线段树#洛谷 6845 [CEOI2019] Dynamic Diameter

    题目 动态修改边权,强制在线询问树的直径. 分析 设 \(dis[x]\) 表示 \(x\) 到1号点的距离. 那么树的直径就可以表示成 \(dis[x]+dis[y]-2*dis[lca]\) 只需 ...

  4. #阶梯NIM#Poj 1704 Georgia and Bob

    题目 有\(n\)个棋子摆放在x轴的正半轴上, 每次将棋子最多向左移动至上一个棋子之后(不能不移动), 不能操作为败,问先手是不是必胜 分析 这个模型可以转换成阶梯NIM的形式, 那么将奇数位置做NI ...

  5. 劫持TLS绕过canary pwn89

    劫持TLS绕过canary pwn88 首先了解一下这个东西的前提条件和原理 前提: 溢出字节够大,通常至少一个page(4K) 创建一个线程,在线程内栈溢出 原理: 在开启canary的情况下,当程 ...

  6. C#_面试题1

    C#_面试题1 1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方 ...

  7. HarmonyOS:NativeWindow 开发指导

      场景介绍 NativeWindow是HarmonyOS本地平台化窗口,表示图形队列的生产者端.开发者可以通过NativeWindow接口进行申请和提交Buffer,配置Buffer属性信息. 针对 ...

  8. CTR预估系列模型漫谈

    FM FM的主要内容 了解fm模型之前,需要先说一下lr带入一下场景.lr作为早期ctr预估里面的模型,其速度上有着无可比拟的优势,而偏偏ctr场景下伴随着有大量的离散特征,高维稀疏特征,这个很适合l ...

  9. k8s 深入篇———— k8s 的pod[五]

    前言 简单整理一下pod的相关知识. 正文 为什么我们需要pod. 前面我们知道了k8s一个最重要的作用是解决容器的编排功能,那么为什么有一个pod的东西. 这就是实际中遇到的问题. 那就是容器和容器 ...

  10. 站点js屏蔽他人广告

    前言 以前自己建设博客的时候,出现一个问题,那就是动不动弹出广告,不晓得这个是怎么查到我的站点的,但是加入了屏蔽js,就没遇到了,在此分享. 正文 防止动态加载script脚本 (function ( ...