您的位置:首页 > 运维架构

名字的作用域(scope)

2012-10-14 14:52 281 查看
C++程序中,每个名字都与唯一的实体(比如变量、函数和类型等)相关联。尽管有这样的要求,还是可以在程序中多次使用同一个名字,只要它用在不同的上下文中,且通过这些上下文可以区分该名字的不同意义。用来区分名字的不同意义的上下文称为作用域(scope )。作用域是程序的一段区域。一个名称可以和不同作用域中的不同实体相关联。

C++语言中,大多数作用域是用花括号{ }来界定的。一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的。例如下面的程序程序:

#include<iosream>

int main()
{
int sum = 0;
// sum values from 1 up to 10 inclusive
for(int val = 1; val <= 10; ++val)
sum += val;
std::coot<<"sum of 1 to 10 includsive 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 )

V++中作用域可嵌套

定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用,等等。名字还可以在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域:

#include<iosream>
#include<string>

std::string s1 = "hello"; //s1 has global scope
int main()
{
std:: string s2 = "world"; // s2 has local scope
// uses global s1;prints "hello worldL"
std::cout << s1 <<" "<< s2 << std::endl;
int s1 = 42; // s1 has local scope 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"。

c++还有另外两种不同级别的作用域:类作用域(class scope)命名空间作用域(namspace scope)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: