C++ 自学教程 第1.4d章
你已经在第1.3章学习了:当CPU看到 int x; 这样的叙述语句后,它会创立变量x。
自然而然的,你可能会问:“所以什么时候变量会被销毁呢?”
“毁灭”的时机
一个变量的作用域决定了一个变量什么时候能被生成和使用。在函数内部定义的参数和变量都有局部作用域。也就是说,他们只能在定义了他们的函数内部被看见和使用。局部变量在其被定义的时候被生成,超过其作用域的时候被销毁(一般在函数最后)。
下面给个简单的例子:
#include <iostream>
int main()
{
int x; //这里x被生成
std::cout << "Enter a value for x: ";
std::cin >> x;
std::cout << "You entered: " << x << std::endl;
return 0;
} //这里x被销毁
下面的例子更复杂一点:
#include <iostream>
int add(int x, int y) //这里生成了x和y
{
//x和y只在这个函数内部有效
return x + y;
} //这里超过了x和y的作用域,它们被销毁了
int main()
{
int a = 5; //这里生成并初始化了a和b
int b = 6;
//a和b只在这个函数内部有效
std::cout << add(a, b) << std::endl; // calls function add() with x=a and y=b
return 0;
} //这里超过了a和b的作用域,它们被销毁了
在函数add()里,参数x和y在函数被调用的时候被创立,它们只在函数add()内部有效,并在函数结束时被销毁。变量a和b在主函数内创立,它们只在主函数内部有效,并在函数结束时被销毁。
为了加深理解,我们来看看依次发生了什么:
• 主函数被执行
• 变量a被生成,并被赋值5
• 变量b被生成,并被赋值6
• 函数add()被调用,给定参量分别是5和6
• add的变量x被生成,被赋值为5
• add的变量y被生成,被赋值为6
• 运算符号+将5和6相加,得到11
• 函数add向呼叫函数返回11
• 函数add变量的x和y被销毁
• 主函数向控制台输出11
• 主函数向操作系统返回数值0
• 主函数的变量a和b被销毁
到这里就结束了。
注意,如果函数add()被调用了两次,那么x和y也会被创建和小孩两次。如果一个程序有很多函数并调用了很多次函数,那么就会有很多变量被创立和销毁。
在上面的例子里,区分变量a,b与变量x,y不是难事。
下面我们来看看下面这个程序:
#include <iostream>
int add(int x, int y) //函数add的变量x和y在这里被创立
{
return x + y;
} //函数add的变量x和y在这里被销毁
int main()
{
int x = 5; //主函数的变量x和y在这里被创立
int y = 6;
std::cout << add(x, y) << std::endl; //主函数的变量x和y的值被赋值给了函数add的x和y
return 0;
} //主函数的变量x和y在这里被销毁
在这个例子里,我们所做的只是改变了函数add内部变量的名字。这段程序依旧能够正常运行,虽然主函数和函数add的变量的名字相同。为什么呢?
首先,我们需要知道虽然主函数和函数add都有一个叫做x的变量,但是这两个变量是不同的。主函数和add函数里的变量x是完全不同的,虽然他们名字相同。
简单来讲,函数add和主函数都不知道对方有一个同名变量。编译器永远都很清楚哪个变量在主函数内是有效的,哪个变量在add函数内可以被使用。这一功能非常有用,因为它使我们的编程变得更加简单。
我们将会在第四章谈更多局部变量的事。
规则:在函数内部被定义的变量和参数只在其内部有效。
小测试
下面这段程序输出什么?
#include <iostream>
void doIt(int x)
{
int y = 4;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
x = 3;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
}
int main()
{
int x = 1;
int y = 2;
std::cout << "main: x = " << x << " y = " << y << std::endl;
doIt(x);
std::cout << "main: x = " << x << " y = " << y << std::endl;
return 0;
}
答
案
如
下
:
main: x = 1 y = 2
doit: x = 1 y = 4
doit: x = 3 y = 4
main: x = 1 y = 2
说明: 这系列笔记是基于网上一个英文教程LearnCPP