高质量C++编程_第6章_函数设计(2)

在函数 或 代码 前后 判断参数 或 变量的合法性

方法:使用断言 assert

作用:用来检查一些必须符合的条件,捕捉 "不应该" 发生的非法情况,如果不符合条件,则不让程序继续运行下去。

使用时间 &  位置:

  前置条件断言:代码执行之前 或 在函数的入口处,使用断言检查 参数 的合法性。

             断言执行:表示调用者出错了

  后置条件断言:代码执行之后 或 在函数的出口处,使用断言检查 参数 是否正确执行

             断言执行:表示代码执行完后,参数的值 出现了 不可能出现的值 

  前后不变断言:代码执行前后 或 在函数的入出口处,使用断言检查参数是否发生变化

             断言执行:表示 执行某些代码后,变量值被修改了

怎么使用:

       在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?(参数在哪种情况下是有意义的)” 一旦确定了的假定,就要使用断言对假定进行检查。

什么时候使用断言:

      1.可以在正常情况下 程序不会到达的地方放置断言

      2.断言可以用于 检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)

      3.使用断言测试方法执行的前置条件和后置条件

      4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

什么地方不要使用断言:

  1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行

  2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值.

错误用法:
assert(i++ < 100)
原因:i++只能在debug下执行,release下不会执行,这就导致在两种环境下运行结果不同

正确用法:
assert(i < 100)
i++;

语法:

assert(表达式);

表达式的值 表示 正确的情况
即,"我断言,XXX是真地" 

使用这个宏前需要包含头文件assert.h

如果表达式的值为假,整个程序将退出,并输出一条错误信息

如果表达式的值为真,则继续执行后面的语句

注意事项:

1、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

     因此,在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用

2、每个assert语句只检验一个条件。因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不推荐使用
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

推荐使用
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值