2.3.6 名字的作用域
C++(www.cppentry.com)程序中,每个名字都与唯一的实体相关联(比如变量、函数和类型等)。尽管有这样的要求,还是可以在程序中多次使用同一个名字,只要它用在不同的上下文中,且通过这些上下文可以区分该名字的不同意义。用来区分名字的不同意义的上下文称为作用域(scope)。作用域是程序的一段区域。一个名称可以和不同作用域中的不同实体相关联。
C++(www.cppentry.com)语言中,大多数作用域是用花括号来界定的。一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的。例如,思考1.4.2节中的程序:
#include int main() { int sum = 0; // sum values from 1 up to 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl; return 0; } |
这个程序定义了三个名字,使用了两个标准库的名字。程序定义了一个名为main的函数,和两个名为sum和val的变量。名字main定义在所有花括号之外,在整个程序都可见。定义在所有函数外部的名字具有全局作用域(global scope),可以在程序中的任何地方访问。名字sum定义在main函数的作用域中,在整个main函数中都可以访问,但在main函数外则不能。变量sum有局部作用域(local scope)。名字val更有意思,它定义在for语句的作用域中,只能在for语句中使用,而不能用在main函数的其他地方。它具有语句作用域(statement scope)。
1. C++(www.cppentry.com)中作用域可嵌套
定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用,等等。名字还可以在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域:
#include #include /* Program for illustration purposes only: * It is bad style for a function to use a global variable and then * define a local variable with the same name */ std::string s1 = "hello"; // s1 has global scope int main() { std::string s2 = "world"; // s2 has local scope // uses global s1; prints "hello world" std::cout << s1 << " " << s2 << std::endl; int s1 = 42; // s1 is local and hides global s1 // uses local s1;prints "42 world" std::cout << s1 << " " << s2 << std::endl; return 0; }
|
这个程序中定义了三个变量:string类型的全局变量s1、string类型的局部变量s2和int类型的局部变量s1。局部变量s1的定义屏蔽(hide)了全局变量s1。
变量从声明开始才可见,因此执行第一次输出时局部变量s1不可见,输出表达式中的s1是全局变量s1,输出“hello world”。第二条输出语句跟在s1的局部定义后,现在局部变量s1在作用域中。第二条输出语句使用的是局部变量s1而不是全局变量s1,输出“42 world”。
像上面这样的程序很可能让人大惑不解。在函数内定义一个与函数可能会用到的全局变量同名的局部变量总是不好的。局部变量最好使用不同的名字。
第7章将详细讨论局部作用域和全局作用域,第6章将讨论语句作用域。C++(www.cppentry.com)还有另外两种不同级别的作用域:类作用域(class scope,第12章将介绍)和命名空间作用域(namespace scope,17.2节将介绍)。
【责任编辑:
董书 TEL:(010)68476606】