您的位置:首页 > 编程语言 > C语言/C++

Google C++ Style

2009-12-02 23:46 211 查看
看fox翻译的中文 Google C++ Style 随手记录下

1.头文件
#define
命名格式:<Project>_<Path>_<File>_H_

尽量不要用头文件,可以用前置声明的情况
class Foo
Foo* Foo&
可以将函数参数和返回值类型声明为Foo
静态数据成员(定义在类定义之外)

复杂的内联可以定义到-inl.h头文件中,然后#include就可以

函数参数顺序 const的输入参数 输出参数

#include的顺序 C库 C++库 其它的库 自己项目的库

2.作用域
匿名空间违反了C++的唯一定义原则(ODR:one definition rule)

不要使用using namespace 但是在方法或者类中可以使用using
using ::Foo::bar
别名namespace fbz = ::foo::bar::baz

嵌套类缺点:任何使用到这个嵌套类的指针都必须包含外围类的声明
不要将嵌套类定义为公有,除非他们是接口的一部分

static限定函数作用域

静态变量都必须使用原生数据类型(POD:Plain old data)

3.类
构造函数的职责,做一些无意义的初始化操作, 有意义的操作可以集中放到一个函数里面

不要用编译器默认创建的默认构造函数,自己写一个。因为编译器产生的很糟糕, 如果定义的类继承自现有
类, 而且又没有增加新的成员变量,则不需要为新类定义默认构造函数

对于单个参数的构造函数要使用C++关键字explicit

// 禁止使用拷贝构造函数和 operator= 赋值操作的宏
// 应该类的 private: 中使用

#define DISALLOW_COPY_AND_ASSIGN(TypeName) /
TypeName(const TypeName&); /
void operator=(const TypeName&)

大多数情况下不要提供拷贝构造函数和复制操作,如果需要提供必须在头文件中说明并合理定义
STL容器的元素要求可拷贝,但是大部分情况应该给STL传递指针

结构体和类:结构体完全是被动对象应该只包含数据。对于仿函数和特性(traits)可以不用class而是struct

数据成员在任何情况下都必须是私有的

多重继承使用的情况少之又少,当所有父类除了第一个外都是接口类的时候使用多重继承

重载了&运算符的类不能被前置声明

尽量不要重载运算符,可以定义相关功能的函数入Equal() CopyFrom(), 不要为了再STL中作为键值使用而重载,
可以通过反函数类型来实现

编写简短函数:函数太长,试着去分割他

4.GOOGLE技巧

5.其它的C++特性
输入参数是const引用或者值参

如果想重载一个函数,考虑让函数名带参数信息 而不是重载参数

不考虑返回值的情况下++i 比 i++效率要高,所以一般建议使用++i

尽量不要是用宏:
1.不要在头文件中定义宏
2.在马上使用时才#define,使用后立即#undef
3.不要对已存在的宏使用#undef
4.不要试图使用展开后会导致C++构造不稳定的宏

使用Boost中被认可的部分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: