编码原则:

  • 一般原则
  • 预处理原则
  • 命名和布局原则
  • 类原则
  • 函数和表达式原则
  • 硬实时原则
  • 关键系统原则

(硬实时原则、关键系统原则仅用于硬实时和关键系统程序设计)

(严格原则都用一个大写字母R及其编号标识,而推荐原则都用小写字母r及其编号标识,对于前者程序员必须严格遵守,而后者则偶尔可以不遵守)

1、一般原则

R100:任何函数和类的代码规模都不应超过200行(不包括注释)。

原因:长的函数和类会更复杂,因而难以理解和测试。

r101:任何函数和类都应该能完全显示在一屏上,并完成单一的逻辑功能。

原因:如果程序员只能看到函数或类的一部分,就很可能漏掉错误的部分。如果一个函数试图完成多个功能,与单功能的函数相比,其规模就可能很大,而且会更复杂。

R102:所以代码都应该遵守ISO/IEC 14882:2011(E)C++标准。

原因:在ISO/IEC 14882标准之上的扩展金额变形可能会不稳定,定义不明确,而且可能影响移植性。

2、预处理原则

R200:除了用于源码控制的#ifdef和#ifndef之外,不要使用宏。

原因:宏不遵守定义域和类型规则,而且使代码变得更不清晰、不易读。

R201:#include 只能用于包含头文件(*.h)。

原因:#include 用于访问接口的声明而非实现细节。

R202:所以的#incldue语句都应位于任何非预处理声明之前。

原因:如果#include语句位于程序中间,就很可能被阅读程序的人忽略,而且容易导致程序不同部分对名字的解析不一致。

R203:头文件(*.h)不应包含非常量变量的定义或非内联、非模板函数定义。

原因:头文件应该包含接口声明而非实现细节。但是,常量常被看作接口的一部分;出于性能的考虑,一些非常简单的函数应该作为内联函数(因此应该放在头文件中);而当前的编译器要求完整的模板定义都放在头文件中。

3、命名和布局原则

R300:应该使用缩进,并且在一个源码文件中缩进风格应该一致。

原因:可读性和代码风格。

R301:每条新语句都另起一行。

原因:可读性。

例子:

int a=7;x=a+7;f(x,9);    //违反
int a=7;
x=a+7;
f(x,9);    //正确

例子:

if(p<q)cout<<*p;    //违反if(p<q)cout<<*p;    //正确

  

R302:标识符的名字应该都具有描述性。

     标识符可以包含常见的缩写和字头缩略。

    如果x、y、i、j是按习惯方式使用,可以认为是有描述性的。

      使用下划线风格(number_of_elements)而不是字头缩略风格(numberOfElement)。

      不要使用匈牙利命名法。

      类型、模板和命名空间的命名都以大写字母开头。

      避免过长的名字。

例子:Device_driver 和Buffer_poor。

原因:可读性。

注意:c++标准规定,以下划线开头的标识符留作语言实现所用,因此在用户程序中应被禁止。

例外:调用经过认证的库,来自库中名字是可以使用的。

R303:标识符不能只在以下方面不同:

  • 大小写不同;
  • 只相差下划线;
  • 只是字母O、数字0或字母D间的替换;
  • 只是字母I、数字1后字母l之间的替换;
  • 只是字母S和数字5之间的替换;
  • 只是字面Z和字数2之间的替换;
  • 只是字母与n和字母h直接的替换。

例子:Head和head  //违反

原因:可读性。

R304:标识符不能只包含大写字母和下划线。

例子:BLUE和BLUE_CHEESE  //违反

原因:全部大写字母的标识符被广泛用于宏名,可能用于经过认证的库中的#include文件,而不应该用于客户程序。

例外:宏名用于保护#include不被重复包含。

4、函数和表达式原则

r400:内层循环的标识符和外层循环的标识符不应重名。

原因:可读性和代码风格。

例子:

int var=9;{int var=7;++var}    //违反:var重名

  

R401:声明的作用域应该尽量小。

原因:保持变量的初始化和使用尽量靠近,以降低混乱的可能性;令离开作用域的变量释放其资源。

R402:所以变量都要初始化。

例子:

int var;    //违反:var没有初始化

原因:未初始化的变量通常是错误之源。

例外:如果数组或容器会立即从输入接受数据,则不必初始化。

注意:许多类型,例如vector和string,有默认的构造函数来完成初始化。

R403:不应使用类型转换。

原因:类型转换是错误之源。

例外:dynamic_cast可以使用。

例外:新风格的类型转换可以使用,用来将硬件地址转换为指针,或者将从程序外部(如GUI库)获取的void*转换为恰当类型的指针。

R404:函数接口中不应使用内置数组类型,即,如果一个函数参数是指针,那么它必须指向单个元素。如果希望传递数组,应使用Array_ref。

原因:数组只能以指针方式传递,而元素数目无法附着其上,只能分开传递。而且,隐式的数组到指针的转换和派生类到基类的转换会引起内存错误。

5、类原则

R500:对于没有共有数据成员的类,用class声明。对没有私有数据成员的类,用struct声明。不要定义既有共有数据成员,又有私有数据成员的类。

原因:清晰性。

r501:如果类包含析构函数或者指针/引用类型的成员,必须为其定义恰当的或禁止(即,不能使用默认版本)拷贝构造函数和拷贝赋值运算符。

原因:析构函数通常会释放资源。对于具有析构函数或者指针和引用类型的类,默认拷贝语义几乎不可能”做正确的事“。

R502:如果类包含虚函数,那么它必须具有虚析构函数。

原因:虚函数可以通过基类接口使用,通过基类接口访问对象的函数可能会删除对象,派生类必须有某种机制(析构函数)来进行清理工作。

R503:接受单一参数的构造函数必须显式声明。

原因:避免奇怪的隐式类型转换。

6、硬实时原则

R800:不应使用异常。

原因:异常不可预测。

R801:new只能在初始化时使用。

原因:不可预测。

例外:可以用定址的new从栈中分配内存。

R802:不应使用delete。

原因:不可预测,可能会引起碎片。

R803:不应使用dynamic_cast。

原因:不可预测(假定使用普通方法实现的)。

R804:不应使用标准库容器,std::array除外

原因:不可预测(假定是用普通方法实现的)。

7、关键系统原则

R900:递增和递减运算不能作为子表达式。

例子:

int x=v[++i];    //违反

++i;int x=v[i];   //正确

原因:可能会被漏掉。

R901:代码不应依赖于算法表达式优先级之下的优先级规则。

例子:

x=a*b+c;    //正确

例子:

if(a<b||c<=d)    //违反:应加上括号(a<b)和(c<=d)

原因:c/c++基础较差的程序员写出的代码中常常会有优先级混乱的情况。

c++程序设计原理与实践(进阶篇)

转载于:https://www.cnblogs.com/l2017/p/7841652.html

编码原则实例------c++程序设计原理与实践(进阶篇)相关推荐

  1. C++学习书籍推荐《C++程序设计原理与实践》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计原理与实践>是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述.书中全面地介绍了 ...

  2. VS2017下安装fltk库——C++程序设计原理与实践图形编程指南

    VS2017下安装fltk库--C++程序设计原理与实践图形编程指南 前言 最近,我在学习<C++程序设计原理与实践>(原书第一版)遇到了安装图形库的问题,我花了两天时间,通过各种途径查找 ...

  3. C++程序设计原理与实践电子书pdf下载

    C++程序设计原理与实践下载链接: ​​​​​​​https://pan.baidu.com/s/1AwGSYoAiyeEGdgBoGNqGpA​​​​​​​ 提取码获取方式:关注下面微信公众号,回复 ...

  4. C++之父名著——C++程序设计原理与实践 英文原版

    C++之父名著--C++程序设计原理与实践 英文原版 转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/08/18/1801986.html

  5. C++程序设计原理与实践(C++之父最作力作) 中文PDF高清版下载

    C++程序设计原理与实践(C++之父最作力作) 中文PDF高清版下载 转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/09/08/182113 ...

  6. ViewDragHelper(二)- 源码及原理解读(进阶篇)

    声明:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本篇为该系列的第二篇,侧重讲解ViewDragHelper 的实现原理和源码逻辑,以及它所提供的Callback. 目录 Vi ...

  7. c++程序设计原理与实践_课程思政水资源系统优化原理与方法课程思政元素的探索...

    案例说明+课程基本信息 案例说明: 水资源系统优化原理与方法的思政教育目标是要让学生建立一种科学思维方式,用辩证和历史唯物主义的观点去观察和分析问题,培养其规则意识和约束观念,以社会主义核心价值观来进 ...

  8. Kafka核心设计与实践原理总结:进阶篇

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! kafka作为当前热门的分布式消息队列,具有高性能.持久化.多副本备份.横向扩展能力.我学习了<深入理解K ...

  9. 《C++程序设计原理与实践》笔记 第15章 绘制函数图和数据图

    本章讨论绘制函数图和数据图的基本机制.关键例子是绘制一元函数图像,以及展示从文件中读取的值. 15.1 引言 我们的主要目标不是输出的美观性,而是理解如何生成这样的图形输出以及所使用的编程技术.你会发 ...

最新文章

  1. Andorid自定义attr的各种坑
  2. 这篇文章很好的诠释了为什么安全框架如此重要?
  3. 查车的行驶轨迹_怎么查车辆行驶轨迹?
  4. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
  5. C# 导出dataGridView中的值到Excel
  6. 培养沙雕要从娃娃抓起
  7. plsql最多可以存多少_银行内部透露:如果有10万块钱,可以都放在余额宝里吗?存银行是不是更好?...
  8. java 一对一的关系_与休眠一对一关系 - java
  9. shell 脚本 简易for循环 脚本
  10. 读懂 SOLID 的「里氏替换」原则
  11. [物理学与PDEs]第1章习题14 求解 rot 方程
  12. C++实现简单的文件I/O操作
  13. 牛客编程巅峰赛S2第6场 - 钻石王者
  14. JQuery 四个常用的DOM操作获得内容 - text()、html()、value 以及 val() ;取属性值attr()----前三个有回调函数
  15. 【c++】【多线程】单例模式及其性能
  16. c语言编译器C11,如何检测c11支持编译器与cmake
  17. html5打印样式没有加载,cad打印样式不见了(cad没有打印样式表)
  18. 《未来世界的幸存者》读书摘录及笔记
  19. 地级市交通基础设施数据,省份交通基础设施数据,处理好的面板数据(excel或stata版本)
  20. 黑马程序员-----c语言从相识相知到renascence持续发布中第一篇

热门文章

  1. sdl 渲染旋转视频的方法
  2. linux主板插硬盘识别不到,z390 m.2 接口插上sata 硬盘后,机械硬盘不识别;HDD 硬盘不识别;z390 m.2和 SATA 硬盘安装组合;,z390主板sata接口在哪...
  3. Java 布尔值(Boolean)
  4. 用PHP做网站的PV、UV、IP访客统计
  5. OCR - 微软windows 11系统自带的Windows OCR功能初体验
  6. 【天天读书】4000万字的《二十四史》,浓缩为这70句,材料必备。
  7. 利用电脑玩android版天天连萌刷高分 二,利用计算机玩Android版“天天连萌”刷高分(一)——截图...
  8. 【NISP】证书详解(1级、2级、三级)疑难解答
  9. 创新奇智通过上市聆讯:成立不久就开始转型,能以AI自称?
  10. 给XJTU大一CS系学生的网络资源推荐及一些建议