C++程序设计:生存期
来源:互联网 发布:淘宝开通子账号未认证 编辑:程序博客网 时间:2024/05/17 22:09
自然界中的事物都有产生和消亡,都有生存期,程序中的简单变量和类的对象也一样有它们的生存期,它们也会产生和消亡。这一讲中用对象来统一表示简单变量和类的对象。对象的生存期分为静态生存期和动态生存期两种。什么叫做静态生存期和动态生存期呢?下面将分别讲解。
1.静态生存期
若某个对象它的生存期与程序的运行期相同,我们就说它具有静态生存期,就是说在程序运行期间它都不会释放。
具有文件作用域的对象都具有静态生存期。
函数内部具有块作用域的对象怎样才能具有静态生存期呢?我们可以使用关键字static修饰对象。比如,static int x;这个语句就是将x声明为具有静态生存期的变量,也成为静态变量。
2.动态生存期
除了上述情况的对象具有静态生存期外,其余对象都具有动态生存期。具有动态生存期的对象产生于声明处,于该对象的作用域结束处释放。
给大家举个例子说明下简单变量和类的对象的生存期,其中涉及到了全局变量和局部变量,这两个概念下一讲会讲到。现在大家可以先这样简单的理解,全局变量就是具有文件作用域的变量,局部变量就是具有块作用域的变量。
#include <iostream>
using namespace std;
int a=1; // a为全局变量,它具有静态生存期。
void fun(void);
int main()
{
static int x; // 局部变量,具有静态生存期,可以叫做静态局部变量,局部可见。
int y=5; // y,z为局部变量,具有动态生存期。
int z=1;
cout<<"---MAIN---\n";
cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
z=z+2;
fun();
cout<<"---MAIN---\n";
cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
a=a+10;
fun();
return 0;
}
void fun(void)
{
// x,y为静态局部变量,具有全局寿命,局部可见。只有第一次进入函数时被初始化。
static int x=4;
static int y;
int z=10; // z为局部变量,具有动态生存期,每次进入函数时都初始化。
a=a+20;
x=x+3;
z=z+4;
cout<<"---FUN---\n";
cout<<" a: "<<a<<" x: "<<x<<" y: "<<y<<" z: "<<z<<endl;
y=x;
}
运行结果:
---MAIN---
a: 1 x: 0 y: 5 z: 1
---FUN---
a: 21 x: 7 y: 0 z: 14
---MAIN---
a: 21 x: 0 y: 5 z: 3
---FUN---
a: 51 x: 10 y: 7 z: 14
这里要说明下,静态局部变量如果没有进行显式初始化,那么它将被默认初始化为0。当第二次进入fun函数时,其静态局部变量x和y将不再初始化,x和y将继续使用fun函数第一次被调用后最后的值来参加下面的运算。具体点说,第一次调用完fun函数后,fun中变量x的值是7,在第二次调用fun函数时,x不会被赋值为4,而是继续使用7作为自己的值。
再用时钟类来给大家一个例子,让大家回想温习下以前和本讲的一些知识。
#include <iostream>
using namespace std;
class Clock //时钟类声明
{
public: //外部接口
Clock();
void SetTime(int NewH, int NewM, int NewS); //三个形参均具有函数原型作用域
void ShowTime();
~Clock(){}
private: //私有数据成员
int Hour,Minute,Second;
};
//时钟类成员函数实现
Clock::Clock() //构造函数
{
Hour=0;
Minute=0;
Second=0;
}
void Clock::SetTime(int NewH,int NewM,int NewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
void Clock::ShowTime()
{
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
//声明全局对象g_Clock,具有文件作用域,静态生存期
Clock g_Clock;
int main() //主函数
{
cout<<"文件作用域的时钟类对象:"<<endl;
//引用具有文件作用域的对象:
g_Clock.ShowTime();
g_Clock.SetTime(10,20,30);
Clock myClock(g_Clock); //声明具有块作用域的对象myClock,并通过默认拷贝构造函数用g_Clock初始化myClock
cout<<"块作用域的时钟类对象:"<<endl;
myClock.ShowTime(); //引用具有块作用域的对象
return 0;
}
运行结果:
文件作用域的时钟类对象:
0:0:0
块作用域的时钟类对象:
10:20:30
这个程序中定义了具有各种作用域的对象,Clock类声明中,SetTime函数声明的三个参数具有函数原型作用域,数据成员具有类作用域,全局对象g_Clock具有文件作用域,对象myClock具有块作用域。除g_Clock具有静态生存期外,其余均有动态生存期。
- C++程序设计:生存期
- C++:生存期
- C++程序设计必知:生存期
- 十九、C++程序设计必知:生存期
- C++程序设计必知:生存期
- c/c++ 变量生存期
- C/C++中变量的生存期
- 生存期
- 生存期
- c 语言变量的全程生存期和动态生存期的体现
- C中变量的内存存储和生存期
- c中变量的存储区和生存期
- c中变量的存储区和生存期
- C语言的变量的作用域和生存期
- C语言变量作用域、生存期及static问题
- C语言的变量的作用域和生存期
- 为 lua 封装 C 对象的生存期管理问题
- C语言的变量的作用域和生存期
- ConcurrentModificationException并发修改异常
- opwenwrt交叉编译(一)——相关资料查询
- 杭电OJ-1000
- 1172 Hankson 的趣味题
- VIM按键布局及配置
- C++程序设计:生存期
- 用Python爬取学院的新闻并通过邮件发送
- 数据结构 线性表
- URL特殊字符需转义
- 洛谷3379 最近公共祖先
- LeetCode OJ---234. Palindrome Linked List
- Maven常用命令
- python+beautifulsoup爬取豆瓣电影TOP250
- 二、创建线程的几种方式