跳至正文
View Categories

2 min read

主要内容 #

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. global_value 的作用域:main 以外的区域,从变量定义到程序末尾(注意,定义之前不属于作用域)。
  • 2. a 的作用域:从变量定义到 main 大括号的末尾(注意,定义之前不属于作用域)。
  • 3. a2 的作用域:从变量定义到 if 大括号的末尾(注意,定义之前不属于作用域)。
  • 嵌套关系:
    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。

  • 首先,这三处定义,所定义的 3 个变量 dashima 是不同的。
  • 在之前的学习中,我们说过,变量的作用域结束时,变量会被释放。
    所以,

  • G 行:只有 A 行定义的 dashima 存在。
  • D 行:存在 A B D 行,定义的 3 个变量 dashima。
  • B 行:存在 A B 行,定义的 2 个变量 dashima。
  • 下面就各个作用域内变量 dashima 的值,做一些说明:

  • if 区域内:存在 A B D 行,定义的 3 个变量 dashima,最小作用域上的变量起作用。
  • main 区域内:存在 A B 行,定义的 2 个变量 dashima,最小作用域上的变量起作用。
  • main 区域外:存在 A 行,定义的 1 个变量 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 已经被释放了。

    习题 #

    课后练习