7.5局部对象
C++语言中,每个名字有作用域,每个对象同样有生命期。两者的含义分别是:
1、名字的作用域是指:知道该名字的程序文本区。
2、对象的生命期是指:该对象的存在时间。
一、自动对象:
默认情况下,局部变量的生命期取决于调用该变量所在函数的执行时,定义该变量的语句被调用时才存在的对象称为自动对象。自动对象在每次调用所在函数时被创建,函数结束时被撤销。如果定义语句提供初始值,则每次调用每次都会给出初始值。
形参也是自动对象,形参所占用的存储空间在创建时给出,在函数结束时释放。
所以函数结束后,形参和自动对象都不能被访问。
二、静态局部对象:
静态局部对象在函数内,但生命期跨越了函数的生命期,这样的局部对象叫静态局部对象。
形式:
static对象名;
静态局部对象在第一次调用定义语句时生成,在整个程序结束之前一直有效。如果函数被多次调用,静态局部对象会保持它的值并更新值。
程序示例:
#include <iostream>
using namespace::std;
int count()
{
staticint a=1;
return ++a;
}
int main(int argc,constchar * argv[])
{
for (int i=0; i<=20; ++i) {
count();
}
cout<<"count calls"<<count()<<endl;
return0;
}
程序中count函数计算自己被调用的次数,每次调用,static对象a的值保持更新,并不随函数的结束而释放内存,而是等整个程序结束,或者释放静态对象时结束。
习题解答:
1、解释形参,局部变量,和静态局部变量的差别,并给出一个有效使用这三种变量程序的例子
答: 1、形参,自动生成对象,声明形式参数。不占内存。只有在定义并初始化形参时才为形参分配内存。函数结束后释放内存。
2、局部变量,在程序文本中的位置处于语句块内,调用函数初始化时变量生成并分配内存,函数结束内存释放。
3、静态局部变量,在程序中处于语句块内,在程序第一次调用函数时分配内存,保持其值并随着调用而不断更新,在程序结束或者释放静态变 量时释放内存。
程序示例:
#include <iostream>
using namespace::std;
int a;
static int b=0;
int count()
{
staticint a=0;
++b;
++a;
cout<<"a is: "<<a<<" b is:"<<b<<endl;
return a;
}
int main()
{
for (int b=1; b<=10; ++b) {
cout<<"a value: "<<a<<endl;
count();
}
cout<<"a value is: "<<a<<" b value is: "<<b<<endl;
return0;
}
程序运行结果:
a value: 0
a is: 1 b is:1
a value: 0
a is: 2 b is:2
a value: 0
a is: 3 b is:3
a value: 0
a is: 4 b is:4
a value: 0
a is: 5 b is:5
a value: 0
a is: 6 b is:6
a value: 0
a is: 7 b is:7
a value: 0
a is: 8 b is:8
a value: 0
a is: 9 b is:9
a value: 0
a is: 10 b is:10
a value is: 0 b value is: 10
如上程序所示:a为静态局部变量,a的值只在调用a所在函数时保持其值更新,直接输出a是保持静态原值。b为全局静态变量值随函数改变,并且全局可调用。
2、编写函数,使其在第一次调用时返回0,然后再次调用按顺序产生正整数。
程序示例:
#include <iostream>
using namespace::std;
static int a=0;
int count()
{
cout<<"a is: "<<a<<endl;
a++;
returna;
}
int main()
{
for (int b=1; b<=10; ++b) {
count();
}
cout<<a<<endl;
return0;
}
程序运行结果:
a is: 0
a is: 1
a is: 2
a is: 3
a is: 4
a is: 5
a is: 6
a is: 7
a is: 8
a is: 9
10