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变量都存放于程序的全局变量区域。因此静态局部变量生命周期在程序运行期间一直存在

猜你喜欢

转载自www.cnblogs.com/xiaonannanbuchengxian/p/11610293.html
今日推荐