4 — 局部作用域介绍

局部变量

函数参数以及在函数体内定义的变量称为局部变量,例如:

int add(int x, int y) // 函数参数x和y是局部变量
{
    int z{ x + y }; // z也是局部变量

    return z;
}

局部变量生命周期

函数参数在输入函数时创建和初始化,函数体内的变量在定义点创建和初始化,自然的后续问题是,那么实例化变量何时被销毁?局部变量在定义它的花括号集的末尾以相反的创建顺序被销毁(或者对于函数参数,在函数的末尾)。
例如:

int add(int x, int y) // x和y在这进行创建和初始化
{
    int z{ x + y }; //z在这进行初始化
    return z;
}//创建的相反顺序,z,y,x依次被销毁。

※:请注意,变量的创建和销毁发生在程序运行时(称为运行时),而不是编译时。因此,生命周期是运行时属性。
稍微复杂的一个例子:

#include <iostream>

int add(int x, int y) //x,y被创建,并进去作用域
{
    // x和y仅在此函数中可见/可用
    return x + y;
} // y , x 离开作用域,并被销毁
int main()
{
    int a{ 5 }; // a被创建并初始化,在这儿进入作用域
    int b{ 6 }; // b被创建并初始化,在这儿进入作用域

    //a和b仅在此函数中可用
    std::cout << add(a, b) << '\n'; // 用x=5和y=6调用函数add()
    return 0;
} //b,a 离开作用域,并被销毁

参数x,y 在调用add函数时创建,只能在函数add中看到和使用,在add结束时销毁,变量a和b在函数main中创建,只能在函数main看到和使用,并在main结束时销毁。
以下是程序运行顺序:

  1. 从main函数开始执行
  2. main函数中的变量a被创建,初始化为5
  3. main函数中的变量b被创建,初始化为6
  4. 使用参数5和6调用add函数
  5. add函数口的x被创建,初始化为5
  6. add函数口的y被创建,初始化为6
  7. operater+运算x+y生成11
  8. add函数复制11到main调用函数。
  9. add的y,x依次被销毁
  10. main函数打印11到控制台
  11. main函数将0返回到操作系统
  12. main的函数中的变量b,a依次被销毁

注意,如果函数add被调用两次,参数x和y将被创建和销毁两次,每次调用一次,就要创建和销毁一次。
再来个同名的变量例子:

#include <iostream>

int add(int x, int y)//add 函数中x,y被创建,并进去作用域
{
    //add 函数中 x和y仅在此函数中可见/可用
    return x + y;
} //add 函数中 y , x 离开作用域,并被销毁

int main()
{
    int x{ 5 };// main函数中x被创建并初始化,在这儿进入作用域
    int y{ 6 }; //main函数中 y被创建并初始化,在这儿进入作用域

    // main's x and y are usable within this function only
    std::cout << add(x, y) << '\n'; // calls function add() with x=5 and y=6

    return 0;
} //main函数中y,x 离开作用域,并被销毁

挡在main函数中时,名称x,y指的是main的局部范围变量x和y。这些变量只在main函数中看到和使用,同样在add函数内,名称x和y指的是函数参数x和y,他们只能在add内部看到和使用。
简而言之,add和main函数都不知道另一个函数的同名的变量,因为作用域不重叠。所有编译器很清楚x和y在什么时候被使用,销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值