
一起动脑筋 · 先看一个小故事
两个函数都把临时分数叫 temp,会不会抢同一张记分纸?
把过程摊开来看
- 进入函数 A创建 A 的临时值
- 进入函数 B创建 B 的临时值
- B 结束B 的普通局部值结束生存期
- 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 吗?
想好了吗?点开看解释
不会,仅仅同名不会连在一起。若通过引用等方式共享数据,则需要按实际关系另行判断。