浅谈标识符作用域

作用域

定义:作用域是一个标识符在程序正文中有效的区域。

种类: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;


}
总结:通过以上的说明发现作用域其实指的就是定义的变量在不同的地方的作用范围,并且在不同的情况中会出现不同的结果。
posted @ 2019-09-26 18:22  木有兮  阅读(589)  评论(0编辑  收藏  举报