静态局部变量和静态数据成员

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

静态局部变量
在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。
静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。
例如,下面的程序定义了全局变量、静态局部变量和局部变量:
 //*********************
//** ch5_2.cpp **
//*********************
#include

void func();
int n=1; //全局变量

void main()
{
static int a; // 静态局部变量
int b= -10; // 局部变量
cout <<"a:" <<<" b:" <<<" n:" <b+=4;
func();
cout <<"a:" <<<" b:" <<<" n:" <n+=10;
func();
}

void func()
{
static int a=2; // 静态局部变量
int b=5; // 局部变量
a+=2;
n+=12;
b+=5;
cout <<"a:" <<<" b:" <<<" n:" <}

运行结果为:
a:0 b:-10 n:l
a:4 b:10 n:13
a:0 b:-6 n:13
a:6 b:10 n:35
程序中主函数main()两次调用了func()函数,从运行结果可以看出,程序控制每次进入func()函数时,局部变量b都被初始化。而静态局部 变量a仅在第一次调用时被初始化,第二次进入该函数时,不再进行初始化,这时它的值是第一次调用后的结果值4。 main()函数中的变量a和b与func()函数中的变量a和b空间位置是不一样的,所以相应的值也不一样。关于变量作用域和可见性的进一步讨论见第6 章。
静态局部变量的用途有许多:可以使用它确定某函数是否被调用过。使用它保留多次调用的值。

对静态局部变量的说明:
(1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变

量)。而对自动变量来说,如果不赋初 值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。


静态数据成员

2010-12-26 16:12:01| 分类: C++ | 标签:静态数据成员 |举报|字号 订阅
(1)***静态数据成员只占一份空间.
每个对象都可以引用这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变了它的值

,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间,提高效率。
在一个类中可以有一个或多个静态数据成员,所有的对象共享这些数据成员,都可以引用它。

(2)***静态数据成员不随着对象的建立而分配空间,也不随着对象的撤销而释放,(一般数据成员是在对

象的建立时分配空间同,在对象撤销时释放).静态数据成员是在程序编译时被分配空间的,到程序结束时

才释放空间.

(3)***静态数据成员可以初始化,但只能在类体外进行初始化,如:

int Box::height=10;//表示对Box中的数据成员初始化
其一般形式为:数据类型名::静态数据成员名=初值;
不必在初始化中语句中加static.
****不能用参数初始化表对静态数据成员初始化。如在定义Box类中这样定义构造函数是错误的:Box

(int h,int w,int len):height(h){} //错误,height是静态数据成员
如果未对静态数据成员赋值,则编译系统会自动赋初值0.

(4)**静态数据成员既可以通过对象名引用,也可以通过类名来引用。

引用静态数据成员:



#include
using namespace std;

class Box
{
public:
Box (int,int);
int volume();
static int height; //把height定义为公用的静态的数据成员
int width;
int length;
};
Box::Box(int w,int len) //对构造函数width和length赋初值
{
width=w;
length=len;
}

int Box::volume()
{
return (height*width*length);
}

int Box::height=10; //对静态数据成员height初始化。




int _tmain(int argc, _TCHAR* argv[])
{
Box a(15,20),b(20,30);
cout<cout<cout<cout<cin.get();
cin.get();
return 0;
}



**静态数据成员并不是属于某个对象的,而是属于类的,但类的对象可以引用它.
如果静态数据成员定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用.

(5)有了静态数据成员,各对

象之间的数据有了沟通的渠道,实现数据共享,因此可以不使用全局变量.全局变

量破坏了封装的原则,不符合面向对象程序的要求.


但是也要注意公用静态数据成员与全局变量的不同,静态数据成员的作用域只限于该类的作用域内(如果是

在一个函数中定义类,那么其中静态数据成员的作用域就是此函数内.)在此作用域内,可以通过类名和域运

算符"::"引用静态数据成员,而不论类对象是否存在.

相关文档
最新文档