C++编程规范

关于组织和策略问题

0、不要拘泥于小节(了解哪些东西不应该标准化)

    类、函数和枚举:LikeThis;变量名:likeThis;私有成员变量名:likeThis_;宏名称:LIKE_THIS。

1、在高警告级别干净利落地进行编译

2、使用自动构建系统

3、使用版本控制系统

    最廉价也最流行的版本控制系统是cvs。

4、在代码审查上投入


关于设计风格

5、一个实体应该只有一个紧凑的职责

6、正确、简单和清晰第一

7、编程中应知道何时和如何考虑可伸缩性

    使用灵活的、动态分配的数据,不要使用固定大小的数组

    优先使用线性算法或尽可能快的算法,尽可能避免劣于线性复杂性的算法:常数时间复杂性算法如push_back和散列表查询,是最完美的;O(logN)对数复杂性算法也不错,比如set/map操作和带有随机迭代器的lower_bound和upper_bound;O(N)线性复杂性算法也可以接受,如vector::insert和for_each;O(NlogN)或O(n^2)算法要寻找替代方案;永远不要使用指数复杂性算法。

8、不要进行不成熟的优化

    首先关注代码正确和易读,必要时再优化

9、不要进行不成熟的劣化

10、尽量减少全局和共享数据

11、隐藏信息

12、懂得何时和如何进行并发性编程


关于编程风格

14、宁要编译时和连接时错误,也不要运行时错误

15、积极使用const

16、避免使用宏

17、避免使用魔数

18、尽可能局部地声明变量

19、总是初始化变量

20、避免函数过长,避免嵌套过深

21、避免跨编译单元的初始化依赖

22、尽量减少定义性依赖,避免循环依赖


关于函数与操作符

25、正确地选择通过值、(智能)指针或者引用传递参数

26、保持重载操作符的自然语义

27、优先使用算术操作符和赋值操作符的标准形式

28、优先使用++和--的标准形式,优先调用前缀形式

29、考虑重载以避免隐含类型转换

30、避免重载&&、||或,(逗号)

31、不要编写依赖于函数参数求值顺序的代码


关于类的设计与继承

32、弄清所要编写的是哪种类

33、用小类代替巨类

34、用组合代替继承

35、避免从并非要设计成基类的类中继承

36、优先提供抽象接口

37、公用继承即可替换性。继承,不是为了重用,而是为了被重用

38、实施安全的改写

39、考虑将虚拟函数声明为非公有的,将公用函数声明为非虚拟的

40、避免提供隐式转换

41、将数据成员设为私有的,无行为的聚集(C中struct)除外

42、不要公开内部数据

43、明智地使用Pimpl

44、优先编写非成员非友员函数

45、总是一起提供new和delete

46、如果提供类专门的new,应该提供所有标准形式(普通、就地和不抛出)


关于构造、析构与复制

47、以同样的顺序定义和初始化成员变量

48、在构造函数中用初始化代替复制

49、避免在构造函数和析构函数中调用虚拟函数

50、将基类析构函数设为公用且虚拟的,或者保护且非虚拟的

51、析构函数、释放和交换绝对不能失败

52、一致地进行复制和销毁

53、显式地启用或者禁止复制

54、避免切片。在基类中考虑用克隆代替复制

55、使用赋值的标准形式

56、只要可行,就提供不会失败的swap(而且要正确地提供)


关于名字空间与模块

57、将类型及其非成员函数接口置于同一命名空间中

58、应该讲类型和函数分别置于不同的名字空间中,除非有意想让它们一起工作

59、不要再头文件中或者#include之前编写名字空间using

60、要避免在不同的模块中分配和释放内存

61、不要在头文件中定义具有链接的实体

62、不要允许异常跨越模块边界传播

63、在模块的接口中使用具有良好可移植性的类型


关于模板与泛型

64、理智地结合静态多态性和动态多态性

65、有意地进行显示自定义

66、不要特化函数模板

67、不要无意地编写不通用的代码


关于错误处理与异常

68、广泛地使用断言记录内部假设和不变式

69、建立合理的错误处理策略,并严格遵守

70、区别错误与非错误

71、设计和编写错误安全代码

72、优先使用异常报告错误

73、通过值抛出,通过引用捕获

74、正确地报告、处理和转换错误

75、避免使用异常规范


关于STL:容器

76、默认时使用vector。否则,选择其他合适的容器

77、用vector和string代替数组

78、使用vector(和string::c_str)与非C++ API交换数据

79、在容器中只存储值和智能指针

80、用push_back代替其他扩展序列的方式

81、多用范围操作、少用单元操作

82、使用公认的惯用法真正地压缩容量,真正地删除元素


关于STL:算法

83、使用带检查的STL实现

84、用算法调用代替手工编写的循环

85、使用正确地STL查找算法

86、使用正确地STL排序算法

87、使谓词成为纯虚数

88、算法和比较器的参数应多用函数对象少用函数

89、正确地编写函数对象


关于类型安全

90、避免使用类型分支,多使用多态

91、依赖类型,而非其表示方式

92、避免使用reinterpret_cast

93、避免对指针使用static_cast

94、避免强制转换const

95、不要使用C风格的强制转换

96、不要对菲POD进行memcpy操作或者memcmp操作

97、不要使用联合重新解释表示方式

98、不要使用可变长参数(...)

99、不要使用失效对象。不要使用不安全函数

100、不要多态地处理数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值