C++面向对象——第三次作业
作业题目:慕课学习第5章。并选出一个你认为有意义的知识点或难点,在电脑上运行代码进行试验,写出完整的实验验证过程。用实验证明该知识点的使用。
浅析变量的生命周期 |
二、分类:
1、全局变量
程序运行期间一直存在。
2、全局静态变量
程序运行期间一直存在。
3、局部变量
当程序运行出了局部作用域时,变量消失,准确来说是销毁,嘿嘿。
4、静态局部变量
程序运行期间一直存在。(这和我写这篇文章之前的认识似乎不一样,下面我就清楚了)
三、过程验证
看下面一段代码:
#include <iostream>
using namespace std;
int entire_a = 1;//赋了初值的全局变量
int entire_b;//全局变量
static int entire_c;//全局静态变量
void Local1()//验证静态局部变量只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值
{
int i = 10;
while (i <= 20)
{
static int n = 1;//静态局部变量
n += 1;
static int local_t = 2;
i += local_t;
}
}
void Local2()
{
int local_s = 6;//局部变量
cout << local_s;
static int local_t = 3;//静态局部变量
cout << "local_t = " << local_t << ",local_s = " << local_s << endl;
}
int main()
{
Local1();
cout << "a = " << entire_a << ",b = " << entire_b << ",c = " << entire_c << endl;//输出全局变量的初始值
entire_a = 11;//改变全局变量a的值
entire_b = 121;//改变全局变量b的值
entire_c = 131;//改变全局静态变量c的值
cout << "a = " << entire_a << ",b = " << entire_b << ",c = " << entire_c << endl;//输出修改之后之后的全局变量值
Local2();//调用函数Local(),输出局部变量local_s的值和局部静态变量local_t的值
int local_s = 66;//重新定义的新的局部变量local_s
static int local_t = 33;//重新定义的新的局部变量local_t
cout << "local_t = " << local_t << ",local_s = " << local_s << endl;//可以输出新的局部变量local_s和新的局部变量local_t
}
可以看出a,b,c在全局中一直存在,全局对象编译时即分配内存并初始化了,但local_s和local_t在主函数中使用时必须要重新定义(相当于重新生成一个新的变量,不是之前的了),不然就是下面这样有问题
静态局部变量说明:
void Local1()//验证静态局部变量只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值
{
int i = 10;
while (i <= 20)
{
static int n = 0;//静态局部变量
n += 1;
static int local_t = 2;
i += local_t;
}
}
从这三张图中可以看到初始化n=0,在第一次使用后就被跳过了,可以得出:静态局部变量相当于全局变量(只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的),函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值。
四、结论:
1、变量的作用域不同于生命周期。作用域与生命周期是变量的属性在空间和时间两个维度的体现。作用域就是一个变量可以被引用的范围,而生命周期就是这个变量可以被引用的时间段。在C++中有很多方法来指定一个变量的作用域和生命周期。最常见的,如:{ }、static修饰符等。
2、存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。不管是在全局还是局部声明的static变量都存放于程序的全局变量区域。因此静态局部变量生命周期在程序运行期间一直存在。