名字的作用域

来源:互联网 发布:linux cp时创建文件夹 编辑:程序博客网 时间:2024/04/28 10:15

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

大多数作用域都是用花括号来界定的.一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的.

下面看一段程序:

#include<iostream.h>
int main()
{
 int sum=0;
 for(int val=1;val<=10;++val)
  sum+=val;
 cout<<"Sum of 1 to 10 inclusive is "
  <<sum<<endl;
 return 0;
}

这里定义了三个名字,使用了两个标准库的名字. 定义了一个名叫main的函数,以及两个名为sum和val的变量.名字main定义在所有花括号外,在整个程序都可见.定义在所有函数外部的名字具有全局作用域(global scope),可以在程序中的任何地方访问.名字sum定义在main函数的作用域,在整个main函数中都可以访问,但main函数外则不能.变量sum具有局部作用域(local scope).名字val呢,它定义在for语句的作用域中,只能在for语句中使用,而不能在main函数的其它地方使用.它具有语句作用域(statement scope)

作用域大概就分这些,全局作用域,局部作用域,语句作用域

我们再来看看C++如何嵌套作用域

定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用.是不是很有趣?大鱼吃小鱼       还有,名字还可以在内部作用域中重新定义.

理解和名字相关联的实体需要明白定义名字的作用域:

#include<iostream.h>
#include<string>
/* 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()
  {
   string s2="world";  //s2 has local scope
   //uses global s1; prints "hello world"
   int s1=42;  //s1 is local and hides global s1
   //uses local s1;prints "42 world"
   cout<<s1<<" "<<s2<<endl;
   return 0;
  }

程序中定义了三个变量:string类型的全局变量s1、string类型的局部变量s2和int类型的局部变量s1.

局部变量s1的定义屏蔽(hide)了全局变量s1

变量从声明开始才可见,因此执行第一次输出时局部变量s1不可见,输出表达式中的s1是全局变量s1,输出hello world第二条输出语句跟在s1的局部定义后,现在局部变量s1在作用域中.第二条输出语句使用的是局部变量s1而不是全局变量,输出42,world

注意:在函数内定义一个与函数可能会用到的全局变量同名的局部变量总是不好的,局部变量最好使用不同的名字.

 

在变量使用处定义变量.

一般来说,变量的定义或声明可以放在程序中能摆放语句的任何位置.变量在使用前必须先声明或定义.

小贴士:通常把一个对象定义在它首次使用的地方是一个很好的办法.

在对象的第一次被使用的地方定义对象可以提高程序的可读性.读者不需要返回到代码段的开始位置去寻找某一特殊变量的定义,而且,在此处定义变量.更容易给它赋以有意义的初始值.

放置声明的一个约束是:变量只在从其定义处开始到该声明所在的作用域的结束处才可以访问.

必须在使用该变量的最外层作用域里面或之前定义变量.

习题:

#include<iostream.h>
int i=42;
int main()
{
 int i=100;
 int j=i;
//....
}

j的值是多少?

答案是100,局部变量i屏蔽了全局变量i,

int i=100,sum=0;
 for(int i=0;i!=10;++i)
  sum+=i;
 cout<<i<<" "<<sum<<endl;  输出是什么?

答案是 100 45

因为i=100是全局变量,而i=0是for语句里面的变量,作用域仅局限在语句内,输出的100是之前

int sum=0;
 for(int i=0;i!=10;++i)
  sum+=i;
 cout<<"Sum from 0 to "<<i
  <<" is "<<sum<<endl;

程序是否合法?

答案是不合法,虽然编译没有错误,但是这里输出的时候使用了只具有语句作用域的i,i只能在for语句里面使用,它仅具有语句作用域,所以上面的程序是不合法的.

原创粉丝点击