高质量程序设计指南C/C++阅读笔记

    阅读书籍:《高质量程序设计指南C/C++语言》林锐、韩勇泉著

说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇

一、软件质量基本概念

    功能属性:

              1、正确性Correcteness

                               软件按照需求正确执行任务的能力,也是精确性;——确定需求的重要性

                     2、健壮性Robustness

                               在异常情况下,软件能正常运行的能力;描述需求范围外的行为;

                               二项内容:容错能力、恢复能力

                     3、可靠性Reliability

                               在一定环境,一定时间段内,程序不出现故障的概率;

                               衡量指标:平均无故障时间(MTTF,mean-timeto fault)

                               典型事件:千年虫、内存泄露、误差累积等;

                              非功能性:(能力)

                     4、性能Performance

                               指软件的“时间——空间”效率(既要马儿跑得快,又要马儿吃得少);优化数据结构、算法和代码提高;

                               代表作:《DeltaForce》《古墓丽影》《反恐精英》等

                     5、易用性Usability

                               用户使用软件的容易程度。

                     6、清晰性Clarity

                               工作成果易读、易理解。

                     7、安全性Security

                               防止系统背非法入侵的能力;既属于技术问题又属于管理问题

                     8、可扩展性Extendibility

                               反映软件适应“变化”的能力。系统设计阶段重点考虑的质量属性。

                     9、兼容性Compatibility

                               两个或两个以上的软件相互交换信息的能力。

                               兼容性的商业规则;弱者设法与强者兼容,否则无容身之地;强者应当避免被兼容,否则市场将被瓜分。

                     10、可移植性Portability

                               软件不经修改或稍加修改就可以运行于不同软硬件环境的能力。

                     瀑布模型:精髓是“线性顺序”。

                         

             

                                    



复用、分而治之、优化折中(折中:协调各个质量属性,达到整体最优,在保证其他质量属性不差的前提下,使某些重要质量属性变得更好。)

                     技术评审:非正式技术评审ITR,正式技术评审FTR

                     测试:

                         测试的常规分类:

                                阶段:单元测试、集成测试、系统测试、验收测试

                                方式:白盒测试、黑盒测试

                               内容:功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试……

                               测试一般流程:

                                           

                        质量保证QA:

                                     

                         修改:

                               1、找到错误思考修改代码的影响;

                               2、改错后一定要马上进行回归测试,以免引入新错误;

                               3、反思与记录心得体会。

                     标准C语言没有提供I/O的实现,只是定义了标准I/O的函数接口。

                     首先掌握语言的特征及其使用方法,再学习具体的语言实现才是语言学习的正道!

二、程序入门

          1、连接规范:关系到编译器使用什么Name—Mangling方案重命名标识符;

                      1)对类型、函数、变量或常量

                                         extern“C”……;

                      2)对一段代码

                                         #ifdef_cplusplus  //or #if _SUPPORT_EXTERN_CPP_

                                         extern"c"{                             //orextern"C++"

                                         #endif

                                         ……

                                         #ifdef_cplusplus   //or #if_SUPPORT_EXTERN_CPP_

                                         }

                                         #endif

2、类型转换

                               1)、隐式转换

                                        一个低级数据类型对象总是优先转换为能够容纳得下它的最大值的、占用空间最少的高级类型对象。一个低级数据类型对象总是优先转换为能够容纳得下                                       它的最大值的、占用空间最少的高级类型对象。

                               提示:标准C语言允许任何非void类型指针和void类型指针之间进行直接的相互转换。但C++中可以把任何类型的指针直接派给void类型指针,反过来则不                                                   行,除非强制转换;

                               2)、强制转换

                                         (1)避免值的截断、内存截断或内存扩张;

                                         (2)避免做违反编译器类型安全原则和数据保护原则的事情;

                     3、标识符

                                         标识符具有属性:值、值的类型、名字、存储类型、作用域范围、连接类型(可见性)、生存期等;

                               避免使用前导“_”"__"来定义标识符;

                     4、转义序列

                     5、运算符

                               C/C++共有:算术运算符、关系运算符和逻辑运算符等;

                               C++新提供:新的类型转换运算符、运行时类型识别运算符(typeid)、作用域解析(::)、动态内存分配和释放、类成员指针等;

                     6、表达式

                     7、基本控制结构

                               1)选择(判断)结构

                               if、if/else(尽量将true的概率高的条件判断至于前面以便提高程序性能)、switch

                                         (1)bool型:尽量和false比较。其它容易出错

                                         (2)整型与零值比较,不能当成bool型;

                                         (3)浮点与零值比较,尽量用“<”和“>”

                                         (4)指针与零值比较,NULL

                                         (5)switch效率比if/else高;

                               2)循环(重复)结构

                                         do/while、while、for;确定循环(计数控制循环)、不确定循环(标志控制循环)和无限循环(死循环)

                                         1)for

                                              计数器不能是浮点数;不要在遍历(迭代)容器的过程中对容器进行增、删元素操作;计数器从0开始,循环变量取值采用“前闭后开区间”写法,避免                                               差1错误;

                                         2)循环语句效率

                                                    对多维数组,正确遍历方法根据语言以什么顺序来安排数组元素的存储空间;

                                                    C/C++是以“先行后列”顺序存储,故应以“先行后列”的顺序遍历;

                                                    如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。

三、常量

                      1、字面常量

                      2、符号常量

                               用#define定义的宏常量;用const定义的常量;

                               const常量可以提高程序的健壮性;

                      3、契约性常量

                      4、枚举常量

                      5、类中的常量

                               非静态const 数据成员的初始化只能在类的构造函数的初始化列表中进行

                               定义类的所有对象都共享的常量:枚举常量和static const

                      6、在C 程序中,const符号常量定义的默认连接类型的是extern的,是外连接,在头文件定义必须加static;

                         在C++程序中,const符号常量定义的默认连接类型是static,即内连接;

                        7、字符串常量在头文件中定义并初始化最浪费空间;在头文件中声明所有常量指针常量,而在源文件中定义并初始化它们,则节省内存,不失效率;

                     阅读页数  95 

四、C/C++函数

        1、P96 函数前置声明     
                      函数原型(解决函数前置声明的不足)
                              [作用域][函数的连接规范]返回值类型[函数的调用规范]函数名(int a,char *b,...);
                     函数参数传递的本质:用实参初始化形参;
                     函数原型作用之一:指导编译器把实参类型隐式转换为形参类型;
                     函数调用方式:过程调用,嵌套调用,递归调用,回调函数(定时器回调函数和线程函数)
                     函数堆栈主要用途:在进入函数前保存环境变量和返回地址;在进入函数时保存实参的拷贝;在函数体内保存局部变量;
        2、函数调用规范:决定实参压栈、退栈及堆栈释放的方式。
                    1)_cdecl:C/C++函数默认调用规范,参数右—>左依次传递并压入堆栈,由调用函数负责堆栈的清退;
                    2)_stdcall:Win API函数调用规范,参数右—>左依次传递并压入堆栈,由被调用函数负责堆栈的清退;该规范生产函数代码比_cdecl更小;
                    3)_thiscall:C++非静态成员函数的默认调用规范,不能使用个数可变的参数;当调用函数 时this指针直接保存在ECX寄存器中而非压入函数堆栈。其他方面与                                                    _stdcall相同。
                   4)_fastcall:函数的实参将被直接传递到CPU寄存器中而不是内存堆栈中。堆栈清退由被调用函数负责。不能用于成员函数。
                   5)凡接口函数必须显示的指定其调用规范,除非接口函数是类的非静态成员函数。COM接口的方法都指定_stdcall调用规范。
        3、函数的连接规范
              COM接口及其使用的数据类型,是否采用统一的连接规范,对其二进制兼容性和可移植性都没影响;普通的静态连接库(.Lib)和动态连接库(.DLL/.SO)中的全局                       数据类型、全局函数、全局变量或常量,其连接规范必须在两端(库和调用端)保持一致。除非用LoadLibrary()和GetProcAddress()函数对来获得DLL中的函数地址。
       4、参数的传递规则 P102

             两种方式:值传递和地址传递
            注意:1)函数无参数写void,不能留空;标准C将空的参数列表解释为可以接受任何类型和个数的参数;标准C++把空的参数列表解释为不可接受任何参数;
                2)参数为指针,仅做输入用,应在类型前加const,防止被无意修改;
                3)如果输入参数以值传递的方式传递对象,则宜改用"const &"方式,因引用的创建和销毁不会调用对象的构造和析构函数,可提高效率;
                4)函数参数个数控制在5个以内;
       5、返回值规则
               1)任何C/C++函数都必须有返回值类型(标准C凡不加类型说明的函数,一律自动案int类型处理;C++则不允许)
               2)函数名字与返回值类型在语义上不可冲突;违反典型getchar();
               3)注意返回对象值和返回引用;
      6、函数内部实现规则
           1)在函数体的“入口处”,对参数的有效性进行检查,检查通过其他途径进入函数体内的变量的有效性;
           2)return语句不可返回指向“堆栈内存”的“指针”或者“引用”;
           3)函数返回值为对象,考虑return语句的效率;P108
          4)函数功能要单一,规模小,控制在50行代码内;
          5)尽量避免函数有“记忆”功能,如static局部变量的使用;
     7、存储类型及作用域规则
1)存储类型
  extern和static用来标识永久生存期限的变量和函数;
  auto和register用来标识临时生存期限的变量;
  默认情况下的存储类型:
全局变量和全局函数是extern的;局部变量是auto;全局常量是static;
局部符号常量是auto的;函数的形参是局部变量,最好不能为static;
另外还有一种存储类型,自由存储(堆存储);
2)作用域规则
标准C语言作用域:文件、函数、程序块和函数原型
C++作用域:比标准C多了类和名字空间。
3)连接类型:外连接、内连接、无连接
插图…………
4)递归函数
A、任何能用递归实现的解决方案都可以用迭代实现;
B、不要使用间接递归
8、使用断言assert(宏)
在函数的入口处,建议使用断言来检查参数的有效性;


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值