编码规范

2.1.1

  • class无公有数据
  • struct 完全公有
  • 必须使用构造函数初始化列表显式初始化直接基类与所有的基本类型数据成员
  • 没有复制意义的类必须用DISALLOW_COPY_AND_ASSIGN宏禁止拷贝构造函数和赋值构造函数。
  • 禁止在构造函数中进行可能出错的复杂操作(比如申请资源), 复杂操作用额外的init()函数实现

2.1.4

  • 有了构造函数string可以隐式转换为person,这个不对,但是string有了构造函数可以使char*隐式转换为string,这个都是一个意思,所以可以

2.1.5

  • 有复制意义的类必须显式给出复制构造函数,并小心指定其行为(浅复制、深复制等)

2.1.8

  • 只能使用共有继承

2.1.9

  • 不能使用多重继承

2.1.11

  • 按照publicprotectedprivate的顺序声明成员。按照类型、方法、数据成员的顺序声明成员,DISALLOW_COPY_AND_ASSIGN放在private区段的末尾

2.1.14

  • 如果使用int作为返回值, 必须遵循”负值表示失败, 非负值表示成功”
  • 若调用了可能返回错误码/空指针的函数,必须检查其返回值。

2.2.1

  • 所有的代码应该定义在namespace中 C/C++ 任何有效代码必须都被namespace封装起来, 除main()函数外.
  • 头文件中禁止在函数、方法、类作用域外的地方使用using
  • 源文件中禁止using namespace,但允许using class

2.2.5

  • 禁止使用默认参数

2.2.8

  • 在不考虑返回值的前提下, 数值类型、指针、迭代器,统一使用前置自增 (自减).

2.3.1

  • 避免对浮点数进行相等或不等比较
  • 作相等比较时,建议把常量或右值变量放在==运算符的右边(new)

2.3.2

  • 分别使用0,0.0,NULL,’\0’表示整数、浮点数、指针、字符中的0。

2.3.9

  • 不应在头文件定义类/结构体类型的全局常量,以减少代码膨胀
  • 使用enum或const定义常量,不使用define
  • 建议由编译器分配值的枚举定义最后一个枚举值为XXX_COUNT(用于循环枚举所有枚举值)

3.1.1

3.2.3

  • 使用空格缩进,不使用制表符
  • 以4个空格为单位缩进
  • 命名空间不缩进

    1
    2
    3
    4
    5
    6
    7
     namespace bsl {
    namespace var {
    class IVar {
    };

    } // namespace var
    } // namespace bsl
  • public/protected/private关键字与类声明对齐

  • 构造函数初始化列表放在同一行或按至少八格缩进并排几行, 如果需要换行, 把: 放在第一行.
  • 比较短的函数声明,整个声明占一行;过长的函数声明,令每一参数占一行,并且垂直对齐, 换行后的参数至少保持8个空格缩进
  • 循环语句的循环体必须使用大括号包围。
  • if/switch/while/for/catch与后边的圆括号之间加一个空格,圆括号内侧与判断表达式之间不加空格
  • for语句圆括号内分号前不加空格,分号后加一个空格

3.5.1

  • 一行内只应声明一个变量
  • 局部变量应尽量延迟到第一次使用处声明
  • 局部变量应在声明处赋初值,指针类型局部变量必须在声明处赋初值。
  • 禁止使用strcpy()/strcat()/strdup()/sprintf()等没有越界检查的函数。考虑使用snprintf()/strncat()/strndup()/snprintf()替代之
  • 禁止使用strncpy实现有问题的函数。