第一节 · 包裹中的包裹 · 语句与作用域

语言,本质上就是字、词、句的集合。在自然语言中,我们所说的话语都是在特定环境下才能正确理解的。特定的环境可以是发言者与倾听者的身份、在何时、在何地、发生过什么事情等等。这些内容可以被统一称作上下文(context)。在 C++ 中同样有上下文的概念,接下来我们就一探究竟。


经过先前的学习,我们对声明变量的操作可以说是轻车熟路了:

int main()
{
    int a = 1;
    int b = 2;
    return 0;
}

此时,我们在main函数的范围内可以直接使用ab两个变量,也就是可以在花括号范围内使用它们。

花括号的用途不仅仅是main函数的边界,它还可以划定一片区域。在区域外的代码不能使用区域内的内容,但区域内的代码可以访问区域外的内容。举个例子,我们可以在main函数的花括号内再使用一对花括号:

int main()
{
    int a = 1;
    {
        int b = 2;
        cout << a << b << endl;		// 在这里可以访问变量 a 与 b
    }
    cout << a << endl;				// 在这里只能访问变量 a,无法访问变量 b
    return 0;
}

很显然,main函数内的新的花括号将其内的代码与外界隔开,这个"外界"包括main函数的其余部分与main函数之外的全部。花括号内部可以访问外界的一切,但外界不得访问花括号内的内容。

要想将花括号内的私有内容公开出去,最简单的办法就是将私有变量的值交给外界储存:

这种由花括号划定的区域就是作用域。作用域可以嵌套,也可以连续写多个。子作用域内还可以声明与外界重名的变量,声明后,这个名字指代的将会是刚刚定义的内部变量。而不是外界的变量:

变量既可在函数内部声明,也可在函数外部声明。在函数内声明的一切变量均可归类为局部变量。相对的,在没有其它限制的情况下,不在函数内声明的变量可归类为全局变量:

全局变量在程序的任何位置都可被访问到。由于它方便快捷,因此常被用于快速编写算法。不过,它也有着命名污染的缺陷。在实际工程项目中,不应当直接使用全局变量。否则很容易因为变量命名问题而陡增项目维护难度。命名空间(namespace)是可靠的解决办法,我们将在后续章节中具体学习。


作用域是实现各种编程范式的基础,它能将应当分清公私的内容隔开,从而不混淆不同部分逻辑所声明的数据。由此看来的是全局变量于局部变量之分,究其本质,是函数作用域与全局作用域的区分。

Last updated