主要内容 #
1. 作用域的嵌套 #
所谓的作用域嵌套,其实我们一点都不陌生。
#include <iostream> using namespace std; int main() { int a(10); if(a > 5) { cout << "Hello World!"; } return 0; }
这里的 main 的 {} 中,嵌套了 if 的 {}。
这就是作用域的嵌套。
我们来看一个比较特别的例子。
#include < iostream > using namespace std; int global_value(0); int main() { int a(10); global_value = 50; if(a > 5) { int a2(12); cout << "Hello World! global_value = " << global_value; } return 0; }
这里,可以划分为 3 个作用域。
嵌套关系:
1 包含 2,2 包含 3。
2. 大作用域和小作用域 #
2.1 划分 #
所以,很明显,1 和 2 相比,1 是大作用域,2 是小作用域。
2.2 同名变量 #
下面,对上述的程序做一些修改。
#include < iostream > using namespace std; int dashima(0); // A 行,dashima 的值为 0 int main() { int dashima(10); // B 行,dashima 的值为 10 dashima = 50; // C 行,dashima 的值为 50 if(dashima > 5) { int dashima(12); // D 行,dashima 的值为 12 cout << "dashima = " << dashima; // E 行,dashima 的值为 12,【注意】,最小作用域的 dashima 的值为 12 } return 0; // F 行,dashima 的值为 50,【注意】,值为 12 的那个 dashima 已经被释放了。 } // G 行,dashima 的值为 0, 【注意】,值为 50 的那个 dashima 已经被释放了。 // main 之外的区域,是有作用的,将在后续介绍。
这是一个很极端的例子。大家在平时的编程中,一定不要这样去写。
这里的 A B D 行,定义了 3 个变量 dashima。
在之前的学习中,我们说过,变量的作用域结束时,变量会被释放。
所以,
下面就各个作用域内变量 dashima 的值,做一些说明:
所以,遇到同名的变量时,分析代码需要先确定它们的作用域。
这些变量虽然名字相同,其实它们本质上都是不同的变量。
一定不能将它们看作相同的变量。
最后将上述代码修改如下,请结合上面的代码,阅读并理解。
#include < iostream > using namespace std; int dashima_0(0); // A 行,dashima 的值为 0 int main() { int dashima_1(10); // B 行,dashima 的值为 10 dashima_1 = 50; // C 行,dashima 的值为 50 if(dashima_1 > 5) { int dashima_2(12); // D 行,dashima 的值为 12 cout << "dashima = " << dashima_2; // E 行,dashima 的值为 12 } return 0; // F 行,dashima 的值为 50,【注意】,dashima_2 已经被释放了。 } // G 行,dashima 的值为 0, 【注意】,dashima_1 已经被释放了。