设为首页 加入收藏

TOP

建议13:掌握变量定义的位置与时机
2013-10-07 14:47:31 来源: 作者: 【 】 浏览:56
Tags:建议 掌握 变量 定义 位置 时机

建议13:掌握变量定义的位置与时机

在C/C++(www.cppentry.com)代码中,变量是一个不得不提的关键词。变量在程序中起着不同寻常的作用。所有的代码中肯定离不开各种类型变量的影子,既有内置类型的,又有自定义类型的。虽然常见,但使用它也是有一定的技巧与玄机的。掌握了这些技巧与玄机,在合适的时机将变量定义在合适的位置上,会使代码变得更具可读性与高效性。

C++(www.cppentry.com)规则允许在函数的任何位置定义变量,当程序执行到变量定义的位置,并接收到这一变量的定义时,就会调用相应的构造函数,完成变量的构造。当程序控制点超出变量的作用域时,析构函数就会被调用,完成对该变量的清理。而对象的构造和析构不可避免地会带来一定的开销,无论该变量在程序中有没有发挥作用,所以建议在需要使用变量时再去定义。

分析下面代码片段中定义的函数:

  1. std::string ChangToUpper(const std::string& str)  
  2. {  
  3.  using namespace std;  
  4.  string upperStr;  
  5.  if (str.length() <= 0 )  
  6.  {  
  7.    throw error("String to be changed is null");  
  8.  }  
  9.  ...    // 将字符变为大写  
  10.  return upperStr;  

在上面的代码中,变量upperStr定义的时机有点早。如果输入字符串为空,函数抛出异常,这个变量就不会被使用。所以,如果函数抛出了异常,就要为upperStr的构造与析构付出代价,而这些代价完全完全是可以避免的。所以,变得精明些,把握变量定义的时机:尽量晚地去定义变量,直到不得不定义时。代码如下所示。
  1. std::string ChangToUpper(const std::string& str)  
  2. {  
  3.  using namespace std;  
  4.  if (str.length() <= 0 )  
  5.  {  
  6.    throw error("String to be changed is null");  
  7.  }  
  8.  string upperStr;  
  9.  ...    // 将字符变为大写  
  10.  return upperStr;  

关于变量定义的位置,建议变量定义得越“local”越好,尽量避免变量作用域的膨胀。这样做不仅可以有效地减少变量名污染,还有利于代码阅读者尽快找到变量定义,获悉变量类型与初始值,使阅读代码更容易。

针对“变量名污染”,最臭名昭著的例子就是在VC 6.0环境的for语句中声明变量i:

  1. for( int i=0; i<N; i++)  
  2. {  
  3.   ...// do something  
  4. }  
  5. ... // some code  
  6. for( int i=0; i<M; i++)  
  7. {  
  8.   ...// do another thing  

上述代码在VC 6.0中是不能通过编译的,编译器会提示变量i重复定义。不熟悉VC 6.0环境的人肯定会很诧异。这是因为在VC 6.0中,i的作用域超出了本身的循环。幸好,微软意识到了这个问题,在其后续的VC++(www.cppentry.com)系列产品中,i的作用域重新被限定在了for循环体中。

不过在这条规则中,还有一个小小的例外,如下所示:

  1. for (int i = 0; i < 1000000; ++i)  
  2. {  
  3.     ClassName obj;  
  4.     obj.DoSomething();  

以上变量的定义遵循了“尽可能晚,尽可能local”的规则,但是ClassName的构造和析构却因此被调用了1 000 000次。更高效的方式就是将obj的定义放在循环之外,构造函数和析构函数的调用次数则会减少到1次:
  1. ClassName obj;  
  2. for (int i = 0; i < 1000000; ++i)  
  3. {  
  4.     obj.DoSomething();  

请记住:

在定义变量时,要三思而后行,掌握变量定义的时机与位置,在合适的时机于合适的位置上定义变量。尽可能推迟变量的定义,直到不得不需要该变量为止;同时,为了减少变量名污染,提高程序可读性,尽量缩小变量的作用域。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇建议14:小心typedef使用中的陷阱 下一篇建议17:提防隐式转换带来的麻烦..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: