编码规范

1. 头文件

1.1. #define保护

define保护的命名格式必须是<PROJECT>_<PATH>_<FILE>_H_。既可以保证在项目内部不重复,也可以保证哪天代码拷贝到其他项目中,也不冲突。

别使用下划线开头

1.2 前置声明

类型声明,没有伴随定义。能够节省编译时间,避免不必要的重新编译。

  • 尽量避免前置声明那些第三方的实体。
  • 函数和类模板,优先使总用

1.3 内联函数

只有当函数非常简短,或者性能关键的函数,才鼓励使用内联函数。否则只会增大代码体积。

不要内联超过10行的函数

1.4 #include的路径及顺序

使用标准的包含顺序,增强可读性和避免隐藏依赖:相关头文件,C库,C++库,其他库的.h,本项目内的.h

// foo.cc
#include "base/foo.h

#include <sys/types.h>
#include <unistd.h>

#include <vector>
#include <map>

#include "base/bar.h"

避免使用特殊的快捷目录...。也不要重复引入foo.h中已经包含的头文件。

foo.h依赖哪些头文件,就必须包含哪些头文件。例如,foo.h依赖vectorbar.h里包含了vector,那么如果你在这么写,是不会有问题的

// foo.c
#include "base/bar.h"
#include "base/foo.h"

但是别人用foo.h是很可能会有编译问题,原因是bar.h隐藏了foo.hvector的依赖关系。

平台特定代码需要条件编译的,可以放到左右include之后,但最简练的做法是放到一个平台相关定义的头文件中,比如:

#include "base/foo.h"
#include "base/port.h" // platform specific defines

2. 作用域

2.1 名字空间

鼓励使用命名空间,但是同一个项目最好不要有多个命名空间,可以基于项目名。最好不要对非std的命名空间使用using指示。可以使用using声明。

2.2 嵌套类

当嵌套类只被外围类使用时,把它作为外围类作用域内的成员,而不是去污染外部作用域的同名类。除非是公共接口的一部分,否则将嵌套类定义成私有。

// foo.h
class Foo {

private:
    class Bar {
        ...
    };

};

2.3 非成员函数、静态成员函数和全局函数

使用静态成员函数或名字空间内的非成员函数,尽量不要用裸的全局函数。

有时候将函数的定义同类的实例脱钩是有益的,甚至是必要的。相比单纯为了封装若干个不共享任何静态数据的静态成员函数而创建类,不如使用名字空间。(注,那些著名的XxxUtils类就是绝佳的反例)

2.4 局部变量

将函数变量尽可能置于最小作用域内,并在变量声明时进行初始化。

for (int i = 0; i < 10; ++i)
    ...

while (const char* p = stretch(str, '/)) str = p + 1;

如果变量是对象,则在循环体外声明这类变量会高效的多:

Foo f;
for (int i = 0; i < 10; ++i) {
    // Foo f; // Don't do this
    f.DoSomething(i);
}

2.5 静态和全局变量

禁止使用class类型的静态或全局变量,它们会导致难以发现的bug和不确定的构造和析构函数调用顺序。例如,当程序结束时,某个静态变量已经析构了,但其他线程试图访问它(自带线程的类很容易犯这类问题)。

如果你确实需要一个class类型的静态或全局变量,可以考虑在main()函数或pthread_once()内初始化一个指针且永不回收。

3. 类

3.1 构造函数的职责

不要在构造函数中进行复杂的初始化(尤其那些可能失败或者需要调用虚函数的初始化)

简单的初始化用类成员初始化完成,保证对象处于正确的状态。

3.2 显示构造函数

对单个参数的构造函数使用explicit关键字

避免不合时宜的隐式转换。

3.3 可拷贝和可赋值类型

3.7 继承

优先使用组合。如果使用继承的话,定义为public继承。不要过度使用实现继承。

如果你的类有虚函数,则析构函数也应该为虚函数。注意数据成员任何情况下都必须是私有的。

只有当所有父类除第一个外都是纯接口类时,才允许使用多继承。纯接口类必须以Interface为后缀(不强制,但是要能和普通类区分开来)。

纯接口类是只有纯虚函数和静态函数的类,没有非静态数据成员,并且不能实例化。

3.8

除了少数特定环境,不要重载运算符。

业务逻辑基本不需要重载运算符。

class Foo
{
public:
    const string& get_name() const;
}
  1. 公共声明放在前面,私有声明方后面。

  2. 不会改变类属性的函数或成员,全部定义为const。通过声明表明你的意图。

  3. 参数和返回值尽量使用常量引用const Foo &

  4. 如果是通用库,请使用namespace保护,避免和其他名字冲突。

  5. 谨慎对待带指针成员的函数,如果有,考虑复制、赋值和析构时,指针资源的处理(不懂请务必查阅Effective C++。

  6. 有参数的构造函数声明为explicit,除非有足够的理由不这么做。

5. 其他C++特性

5.1 引用参数

所有按引用传递的参数必须加上const。

输入参数是值参或const引用,输出参数为指针。输入参数可以是const指针,但绝对不能是非const的引用参数,除非用于交换,比如swap().

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,238评论 0 4
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,725评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,685评论 18 139
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,521评论 1 51
  • 仔细想想,我的2016发生了很多变化,不仅仅是经济上的,还包括心态上面,心理层次等。 2016前面阶段太过于浮躁,...
    场景为王阅读 189评论 0 0