C/C++静态变量

 (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
  (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同 ,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还 继续存在,但不能使用它。
  (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。

  (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

#include <iostream>
#include <string>
using namespace std;
int fun()
{
 static int b;
 b++;
 return b;
}
int main()
{
 int m;
 for(int i=0;i<3;++i)
 {

  printf("%d\n",fun());
 }
// printf("%d\n",b);//如果这样会出现未定义
 return 0;
}

————————————————————————

先说说C中的静态变量和静态函数。(1)C中的静态变量是处于全局存储区,区别于自动变量的存储于栈中。两者的关键区别是其作用域的区别。自动变量的作用域处于其所在的函数或语句块中;而静态变量的作用域起始于其定义处,终止于程序结束处。(2)C中的静态函数主要是限制函数的名字以及可访问域于文件中,表示此函数仅供此文件所用,不允许在其他文件中调用的。有关静态函数的使用可以考虑几点:一是静态函数的名字仅可见于其所定义的文件。这就允许在不同的文件中存在同名的静态函数可以利用此特性将本文件常用的代码抽象出来成为函数,而在使用此段代码的地方直接调用函数即可。这样允许用简短的名词定义此函数。我的体验,在面临定义功能相同的函数是,为他们取一个美丽的名字其实很困难,而在使用上对名字的记忆也颇费苦心。而用静态函数可以省力许多。而普通函数是可以全局访问的,而且在C中没有名字空间的概念,所以对C中函数的命名颇费苦心。

   再说C++中的静态成员变量和静态成员函数。(1)类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。特别需要注意的一点是:静态数据成员不能在类中初始化(对于常量静态类变量有待考证,好像可以在类外或main()函数之前定义,初始化可以放在类中),一般在类外和main()函数之前初始化,缺省时初始化为0。静态数据成员用来定义类的各个对象所公有的数据,比全局变量更安全。(2)类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。静态成员可定义为inline函数。一般情况下静态成员函数用于访问同一类中的静态数据成员或全局变量,而不访问非静态成员,如需访问非静态成员,需要将对象作为参数,通过对象名访问该对象的非静态成员。静态成员函数也可以在类外定义,此时不可以用static修饰。静态成员函数存在的原因是什么呢?主要是在建立任何对象之前可用它来访问静态数据成员,普通函数不能实现此功能。

   C++静态成员和静态成员函数的使用:静态成员的调用格式:类名::静态数据成员名、对象名.静态数据成员名、对象指针->静态数据成员、对象引用.静态数据成员(但类中很少会出现公有数据成员,这段仅仅讨论语法,未考虑实际运用中的数据封装问题)。静态成员函数的调用格式:类名::静态成员函数名、对象名.静态成员函数名、对象指针->静态成员函数名、对象引用.静态数据成员。静态成员函数没有this指针,因它不与特定对象相联系,调用时推荐使用“类名::静态成员函数名”格式。总结来说,在有对象的情况下,可以用调用普通类成员函数、普通成员变量的方式调用静态成员函数和静态成员变量。从这里可以看出静态成员变量和静态成员函数的使用应该是在不建立任何对象的情况下调用它们。其应用可以参见设计模式中Singleton pattern。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值