Effective C++读书笔记之尽量延后变量定义式的出现时间

      只要你定义了一个变量而其类型带有一个构造函数和析构函数,你就要承受构造和析构成本。有时这个变量最终并未被使用,这就是一种浪费了。你可能会说我不可能定义一个不使用的变量。哈哈  看看下面的代码例子,有时这种不使用不是由你故意造成的。
 有一个计算通行密码的加密版本而后返回,前提是密码够长,否则函数会抛出一个异常。如下:
 //这个函数过早定义变量"encrypted"
 std::string encryptPassword(const std::string& password)
 {
  using namespace std;
  string encrypted;
  if(password.length() < MinimunPasswordLength)
  { throw logic_err("Password is Too Short"); }
  .....        //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 问题出在如果代码抛出异常,则encrypted没有完全的被使用,可是你还是会付出构造和析构成本。所以最好是延后变量的定义式,直到确实需要它。如下:
 //延后了encrypted的定义式
 std::string encryptPassword(const std::string& password)
 {
  using namespace std;
  if(password.length() < MinimunPasswordLength)
  { throw logic_err("Password is Too Short"); }
  string encrypted;   //延后定义了
  .....        //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 上面的代码还是有问题,就是在encrypted定义时使用了default构造函数,因为encrypted虽然获定义却无任何实参作为初值,这样下面你还要给它赋初值。这就是一种浪费了。更受欢迎的做法是以password作为encrypted的初值,跳过毫无意义的default构造函数,如下:
 //这是定义初始化encrypted最佳的方法
 std::string encryptPassword(const std::string& password)
 {
  .....                         //和前面一样
  string encrypted(password);   //使用了copy构造函数定义并初始化
  .....                         //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 本条款“尽可能延后“的真正意义:不只应该延后变量的定义,直到非使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。这样不仅能够避免构造和析构非必要对象,还可以避免无意义的default构造行为。
 总结:
 尽可能延后变量定义式的出现,这样做可增加程序的清晰度并改善程序效率 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值