`
fullfocus
  • 浏览: 102862 次
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多

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

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
分享到:
评论
15 楼 Elminster 2007-01-16  
七猫 写道
从理论上来都是在第一次使用前构造好,C++的全局变量的构造次序似乎难以保证。


全局变量理论上只能保证在 main 函数之前构造完毕,同时一个翻译单元内的全局变量按声明次序构造,除此之外没有任何保证,所以万一一个全局变量构造时试图访问另一个全局变量的话,很容易出问题。而局部静态变量则保证在第一次调用时构造,这个确定性强多了。
14 楼 七猫 2007-01-16  
从理论上来都是在第一次使用前构造好,C++的全局变量的构造次序似乎难以保证。
13 楼 Elminster 2007-01-16  
七猫 写道
跟全局变量好像是一样的,只不过只能函数内访问,确实有时候很有用。
class SystemInfo
{
public:
static int number_of_processors()
{
return _get_systeminfo().dwNumberOfProcessors;
}

/// Returns the page size of the host machine
static int page_size()
{
return _get_systeminfo().dwPageSize;
}

/// Returns the allocation granularity of the host machine
static int allocation_granularity()
{
return _get_systeminfo().dwAllocationGranularity;
}

/// Provides a non-mutable (const) reference to the \c SYSTEM_INFO instance
static const SYSTEM_INFO &get_systeminfo()
{
return _get_systeminfo();
}
private:
static SYSTEM_INFO &_get_systeminfo()
{
static SYSTEM_INFO  s_systeminfo;
static bool nnouse=(::GetSystemInfo(&s_systeminfo), true);
return s_systeminfo;
}
};


和全局变量不太一样。最大的区别是静态局部变量构造的时机是确定的,它在该函数第一次被调用时构造,而全局变量的构造时机则较难确定。这个在需要保证对象之间的构造次序的情况下,非常有用。
12 楼 七猫 2007-01-16  
跟全局变量好像是一样的,只不过只能函数内访问,确实有时候很有用。
class SystemInfo
{
public:
static int number_of_processors()
{
return _get_systeminfo().dwNumberOfProcessors;
}

/// Returns the page size of the host machine
static int page_size()
{
return _get_systeminfo().dwPageSize;
}

/// Returns the allocation granularity of the host machine
static int allocation_granularity()
{
return _get_systeminfo().dwAllocationGranularity;
}

/// Provides a non-mutable (const) reference to the \c SYSTEM_INFO instance
static const SYSTEM_INFO &get_systeminfo()
{
return _get_systeminfo();
}
private:
static SYSTEM_INFO &_get_systeminfo()
{
static SYSTEM_INFO  s_systeminfo;
static bool nnouse=(::GetSystemInfo(&s_systeminfo), true);
return s_systeminfo;
}
};
11 楼 Elminster 2007-01-09  
Arath 写道
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

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


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


相对于全局变量,我更加倾向于静态局部变量。后者更安全,而且它也算不上什么生僻少见的用法。
10 楼 grantren 2007-01-08  
Arath 写道
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

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


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



局部静态变量本来就是这样的,老谭的C程序设计上就有而且很多工程中就这样用,这不算是偏门吧。
其他的话倒是同意。
9 楼 grantren 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;
}
8 楼 raylin 2006-12-31  
呵呵。。从OO的角度也许不好。但是这在C++中很常见。
7 楼 Arath 2006-12-28  
fullfocus 写道
引用
如果这样提倡把静态数据放在函数外


file scope的变量应该少用吧


尽信书不如无书,关键要使用得当
6 楼 fullfocus 2006-12-27  
引用
如果这样提倡把静态数据放在函数外


file scope的变量应该少用吧
5 楼 Arath 2006-12-27  
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

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


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

4 楼 runes 2006-12-27  
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton
3 楼 Arath 2006-12-27  
如果这样提倡把静态数据放在函数外
2 楼 fullfocus 2006-12-27  
恩,说得有道理!
我记得该书中是用来计算fabnaci函数的,利用每次计算可以保存已经计算过的值,来加快程序。
如 可以先定义一个静态局部数组来保存计算过的值。
fabnaci(4)调用完之后,在该数组中自动保存了fabnaci(1),
fabnaci(2),fabnaci(3)的值,如果以后要计算fabnaci(6),只要在计算4之后的部分即可,不用全部重新计算。

我想在小应用中还可以,在大工程中确实不提倡,^_^
1 楼 Arath 2006-12-27  
此类做法我自己归类为语法偏门,是极度不推荐使用的。
在C/C++中有很多这类的偏门,不是每个程序员都了解,即使是了解的人也因为长期不接触而导致淡忘,这样所引发的结果有两点:
1. 减低代码的可读性.
2. 不了解或概念模糊带来歧义,从而给整个工程带来不可预知的灾难.
而且这类语法偏门还可能因为编译器的不同而带来不同的产生结果,不过这一点一般不会接触到.
当然也有其好处就是...如果你是研究加解密,利用偏门是个手段^.^

相关推荐

    Essential C++中文版pdf

    《Essential C++》是一本深入浅出介绍C++编程语言的经典著作,旨在为初学者和有经验的程序员提供一个全面、系统且实用的学习指南。这本书由Stanley B. Lippman编写,以其清晰的解释和丰富的实例,帮助读者理解和掌握...

    Essential C++中文版.pdf

    总之,《Essential C++》中文版是一本全面覆盖C++基础知识和高级特性的教程,对于希望深入学习C++的开发者来说,是一份宝贵的资源。通过阅读这本书,读者将能够掌握C++的核心概念,并能够运用这些知识编写出高效、...

    Essential C++ (中文版PDF) 附加源代码

    《Essential C++》是一本针对C++编程语言的基础教程,中文版的PDF形式使得国内读者更容易理解。这本书由Stanley B. Lippman撰写,他是一位在C++领域有着深厚造诣的专家,其作品通常深受程序员喜爱。"Primer C++缩减...

    Essential C++中文简体版 电子书

    通过阅读《Essential C++》中文简体版,初学者不仅可以系统地学习C++的基本语法,还能了解到C++的高级特性,从而逐步成为一名熟练的C++开发者。这本书以实例驱动,结合清晰的解释,旨在使学习过程更加直观和有趣。

    Essential+C++中文版.pdf

    您提供的文件信息中【标题】为:"Essential+C++中文版.pdf",【描述】是标题的重复,【标签】为"C++",而【部分内容】则是一系列看似经过OCR扫描处理并出现乱码的文本。OCR扫描文本通常包含识别错误,而且在没有完整...

    Essential C++中文版

    Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential C++中文版Essential ...

    Essential C++中文版+完整源代码+习题答案

    Essential_C++ 程序源代码 本書的所有程式,以及習題解答中的完整程式碼,皆可線上取得。你可以在 Addison Wesley Longman 的網站(www.awl.com/cseng/titles/0-201-48518-4)或我的個人首頁(www.objectwrite.com)...

    Essential C++ 中文版

    Essential C++ offers a fast-track to learning and working with C++. This book is specifically designed to bring you up to speed in a short amount of time. It focuses on the elements of C++ programming...

    Essential C++ 中文版.rar

    《Essential C++》是一本...通过阅读《Essential C++》中文版,读者将能够掌握C++的基础知识和高级特性,进一步提升编程技能。书中不仅涵盖了理论知识,还提供了丰富的实例和练习,帮助读者巩固所学并解决实际问题。

    Essential C++中文版(全)

    《Essential C++中文版(全)》是一本详尽阐述C++编程语言核心概念和技术的书籍,旨在帮助读者深入理解C++的本质和精髓。C++是一种强大的、面向对象的编程语言,它在软件开发领域有着广泛的应用,尤其是在系统编程、...

    Essential C++中文版(详细书签)

    《Essential C++中文版》是美国计算机科学家Stanley B. Lippman编著的一本C++语言入门书籍。本书的中译版由仇捷翻译,并由华中科技大学出版社出版。该书属于C++深入系列丛书之一,旨在为初学者提供一个简洁而全面的...

Global site tag (gtag.js) - Google Analytics