名字的作用域(scope)
2012-10-14 14:52
281 查看
C++程序中,每个名字都与唯一的实体(比如变量、函数和类型等)相关联。尽管有这样的要求,还是可以在程序中多次使用同一个名字,只要它用在不同的上下文中,且通过这些上下文可以区分该名字的不同意义。用来区分名字的不同意义的上下文称为作用域(scope )。作用域是程序的一段区域。一个名称可以和不同作用域中的不同实体相关联。
C++语言中,大多数作用域是用花括号{ }来界定的。一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的。例如下面的程序程序:
这个程序定义了三个名字,使用了两个标准库的名字。程序定义了一个名为main的函数,以及两个名为sum和val的变量。名字main定义在所有花括号之外,在整个程序都可见。定义在所有函数外部的名字具有全局作用域(global scope ),可以在程序中的任何地方访问。名字sum定义在main函数的作用域中,在整个main函数中都可以访问,但在main函数外则不能。变量sum有局部作用域(local
scope)。名字val更有意思,它定义在for语句的作用域中,只能在for语句中使用,而不能用在main函数的其他地方。它具有语句作用域(<statement scope ) 。
V++中作用域可嵌套
定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用,等等。名字还可以在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域:
这个程序中定义了三个变量: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)。
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)。
相关文章推荐
- 3.3.5 - [basic.scope.namespace] - 【基本.作用域.名字空间】
- 关于tensorflow的变量(variable) 变量作用域(variable_scope) 名字作用域(name_scope)的学习记录
- AngularJS入门教程之Scope(作用域)
- Maven学习笔记(四)---maven依赖关系中Scope的作用
- spring中scope作用域
- 转深入理解 AngularJS 的 Scope作用域
- Struts2+hibernate+spring 配置文件中scope="prototype"的作用
- C/C++中的名字空间与作用域示例详解
- Web 四个作用域(scope)的用处
- angulajs 中 $scope.$apply方法的作用
- spring中scope作用域
- maven中scope的作用
- maven依赖关系中Scope的作用
- Javascript中的作用域(scope)
- Spring中Scope作用域
- maven依赖关系中Scope的作用
- JSP的scope作用域
- you don't know js -- Scope and Closures学习笔记——第二章(词法作用域)
- --@angularJS--独立作用域scope绑定策略之=符策略
- js教程:javascript作用域(Scope)