论坛首页 综合技术论坛

《Essential c++中文版》读书笔记--静态局部变量(一)

浏览 17556 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-25  

   今天碰到一个局部静态变量的作用域的问题。有些诱惑,所以回去上机实践了以下,总结如下:

cpp 代码
  1. #include <stdio.h></stdio.h> <stdio.h></stdio.h> <stdio.h>
  2. int* f1(int i)   
  3. {   
  4.   
  5.     static int s = 2;  //局部静态变量,其只在本函数之内存在。但又与局部变量相区别,其在离开函数时并不消失   
  6.     s = s +i;   
  7.     return &s;  //可以返回地址   
  8. }   
  9. void main()   
  10. {   
  11.  int *a =   f1(1);   
  12.   
  13.  printf("cout:%d\n",*a);   
  14.     
  15.  a = f1(1);    // s只初始化一次   
  16.   
  17.   printf("cout:%d\n",*a);  //   
  18.   
  19.   //s  = s+1;   出错,s在此范围不存在。其不是file scope   
  20.   
  21. }  

运行结果:

 

  • 大小: 106.7 KB
   发表时间:2006-12-27  
此类做法我自己归类为语法偏门,是极度不推荐使用的。
在C/C++中有很多这类的偏门,不是每个程序员都了解,即使是了解的人也因为长期不接触而导致淡忘,这样所引发的结果有两点:
1. 减低代码的可读性.
2. 不了解或概念模糊带来歧义,从而给整个工程带来不可预知的灾难.
而且这类语法偏门还可能因为编译器的不同而带来不同的产生结果,不过这一点一般不会接触到.
当然也有其好处就是...如果你是研究加解密,利用偏门是个手段^.^
0 请登录后投票
   发表时间:2006-12-27  
恩,说得有道理!
我记得该书中是用来计算fabnaci函数的,利用每次计算可以保存已经计算过的值,来加快程序。
如 可以先定义一个静态局部数组来保存计算过的值。
fabnaci(4)调用完之后,在该数组中自动保存了fabnaci(1),
fabnaci(2),fabnaci(3)的值,如果以后要计算fabnaci(6),只要在计算4之后的部分即可,不用全部重新计算。

我想在小应用中还可以,在大工程中确实不提倡,^_^
0 请登录后投票
   发表时间:2006-12-27  
如果这样提倡把静态数据放在函数外
0 请登录后投票
   发表时间:2006-12-27  
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton
0 请登录后投票
   发表时间:2006-12-27  
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton


没有瞧不起的意思,但是这种写法不是所有人都能够理解清楚的。
程序除了能够正确实现功能的同时也希望能够较为容易的被他人所看懂,使用一些生僻或者歧义的语法或功能(我就简单说为语法偏门)是很大阻碍.
当然不是说不需要了解这些,如果了解了那么至少对自己是一个提高,只是不建议使用.
还有就是这些语法偏门都可以被直观易懂的语法或功能替代的时候,为什么要用呢(特殊场合除外)?

0 请登录后投票
   发表时间:2006-12-27  
引用
如果这样提倡把静态数据放在函数外


file scope的变量应该少用吧
0 请登录后投票
   发表时间:2006-12-28  
fullfocus 写道
引用
如果这样提倡把静态数据放在函数外


file scope的变量应该少用吧


尽信书不如无书,关键要使用得当
0 请登录后投票
   发表时间:2006-12-31  
呵呵。。从OO的角度也许不好。但是这在C++中很常见。
0 请登录后投票
   发表时间:2007-01-08  
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton


这位说得没错,局部静态变量有时候是很有用的,Singleton最优雅的实现就是使用局部静态变量。大牛Scott Mayers著作中说得很清楚。大概代码如下:

class Singleton {
public:
    Singleton& getInstance();

private:
    Singleton(){}
};

Singleton& Singleton::getInstance() {
    static Singleton instance;
    return instance;
}
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics