女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

两个函数都把临时分数叫 temp,会不会抢同一张记分纸?

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 进入函数 A创建 A 的临时值
  2. 进入函数 B创建 B 的临时值
  3. B 结束B 的普通局部值结束生存期
  4. A 继续使用 A 的值

局部变量在特定作用域中使用。不同函数可以有同名局部变量,它们不是同一个对象。

可以把每次函数调用想成带着自己的一份工作纸。

01什么是局部变量?

void test() {
    int score = 95;
}

score 是函数体中的局部变量。它的名字只能在相应作用域里使用。

02离开函数后还能访问它吗?

void test() {
    int score = 95;
}

int main() {
    std::cout << score; // 错误
}

score 的名字不在 main 的作用域里。

03作用域和生命周期是一回事吗?

不是。

作用域(scope)

名字在源代码的哪些位置可以被使用。

生命周期(lifetime)

对象从什么时候开始存在,到什么时候结束存在。

二者经常相关,但不是同一个概念。

04局部变量是不是都住在“栈”里?

很多实际实现中,函数的普通局部对象可能放在运行时调用栈的某个栈帧里。

但这不是 C++ 语言标准对每个局部变量的强制规定。

05大括号里面还能有自己的局部变量吗?

int x = 1;

if (x > 0) {
    int y = 2;
    std::cout << y;
}

// 这里不能再使用 y

大括号形成块作用域,y 只在这个块里可见。

06两个函数里能有同名变量吗?

void a() {
    int x = 1;
}

void b() {
    int x = 2;
}

可以。它们属于不同作用域,是两个不同对象。

07为什么要限制局部变量的范围?

减少冲突

不同函数可以放心使用自己的名字。

结构清楚

数据只在真正需要的位置出现。

便于管理

对象不必永远存在。

你已经知道了什么

  • 局部变量只在对应作用域内通过名字访问。
  • 作用域和生命周期不是同一个概念。
  • 离开相应作用域后,自动存储期局部对象通常结束生命周期。
  • “局部变量一定在栈上”不是 C++ 的严格规则。
  • 不同函数可以拥有同名但彼此独立的局部变量。

下一篇:一个函数调用另一个函数会发生什么?

轮到你来试一试

A 的 temp 是 3,B 把自己的 temp 改成 9,A 的 temp 会随之变成 9 吗?

想好了吗?点开看解释

不会,仅仅同名不会连在一起。若通过引用等方式共享数据,则需要按实际关系另行判断。