浅谈标识符作用域
作用域
定义:作用域是一个标识符在程序正文中有效的区域。
种类:1;函数原型作用域
2:局部作用域
3:类作用域
4:命名空间作用域
1;函数原型作用域; 在函数原型声明时形参的作用范围就是函数原型作用域。
eg:
double area(double radius);
标识符radius的作用范围就在函数area形参列表的左右括号之间,而不能在其他地方引用。
2;局部作用域:函数形参列表中形参的作用域,从形参列表的声明处开始,到整个函数体结束时为止。具有局
eg;
#include<iostream>
using namespace std;
int main()
{
int a,b,t,j;
cin>>a>>b;
t=a+b;
if(a>0)
{
int c;
cin>>c;
j=a+c;
}
cout<<"t的值为"<<t<<" "<<"j的值为"<<j<<endl;
}
我们由上面可以看出a,b,t,j的作用域是整个main函数,然而c的作用域是在if里面。
3;类作用域:类可以被看做是一组有名成员的集合,类X的成员m具有类作用域。
对m的访问方式有以下三种:
1;如果在X地成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m.
eg;
Date date;
date.show();
2:通过表达式x.m或者X::m。
eg:
void Date::show()
{
cout<<Date::day<<endl;
}
3:通过ptr->m这样的表达式,其中ptr为指向X类的一个对象的指针。
eg;
Date*date = new date();
date->show();
4;命名空间作用域:一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的,不属于前面所述各个作用域的标识符,都属于命名空间作用域。
命名空间作用;消除因不同模块中的类和函数之间可能发生重名而引起的错误。
以下是命名空间作用域的几种用法形式;
1;在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,则
命名空间名::标识符名
eg:
namespace SomeNs{
class SomeClass{....};
}
2;如果觉得命名空间限定显得过于冗长,则可以采用using语句
using命名空间名::标识符名;
using namespace::标识符名;
3;命名空间允许嵌套
eg:
namespace OuterNs{
namespace InnerNs{
class SomeClass{....};
}
}
实例验证;下面所声明的全局变量就具有全局空间作用域,他们在整个文件中都有效。
#include<iostream>
using namespace std;
int i; //在全局命名空间中的全局变量
namespace Ns {
int j; //在Ns空间中命名的全局变量
}
int main()
{
i = 5; //为全局变量i赋值
Ns::j = 6; //为全局变量j赋值
{ //子块1
using namespace Ns; //使得在当前块中可以直接引用Ns命名空间的标识符
int i; //局部变量,局部作用域
i = 7;
cout << "i=" << i << endl; //输出7
cout << "j=" << j << endl; //输出6
```
}
cout << "i=" << i << endl; //输出5
return 0;
}