c++作用域
作用域
作用域是一个标志符在程序正文中有效的区域
1.函数原型作用域
函数作用域是C++程序中最小的作用域,在函数原型声明时参数的作用范围就是函数原型的作用域
2.局部作用域
函数体内声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止,局部变量的作用范围便是局部作用域。
3.类作用域
类可以被看做是一组有名成员的集合,类的成员m具有类作用域,对m的访问有三种:
(1)如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可直接访问成员m.也就是说m在这样的函数中都起作用。
(2)通过表达式x m或者x::m。这正是程序中访问对象成员的最基本方法。
(3) 通过ptr- >m这样的表达式,其中ptr为指向x类的一个对象的指针。
4.命名空间作用域
一个大型的程序通常)模块构成 .不同的模块甚至有可能 是由不同人员开 发的。不同模块 中的类和丽数可能发生重名。这样就会引发错误。 这就好像上海和武汉都有南京路,如果在缺乏k的情况下直接说出“南京路”,就会产生歧义。但如果说“上海的南京路”或武汉的”,歧义就会消除。命名空间起到的就是这样的作用。命名空间的语法形式如下:
namespace 命名空间名
{
命名空间内的各种声明(函数声明、类声明、......)
}
一个命名空间确定一个命名域,在空间内声明的都属于该命名空间域,但要使用其他空间的标志符,需要使用下面的语法:
命名空间名::标识符名
作用域示例:
#include <iostream>
using namespace std;
int i;//在全局命名空间中的全局变位
namespace Ns
{
int j;//在N命名空间中的全局变量
}
int main()
{
i=5; //为全局变量 i 赋值
Ns::j=6;//为全局变量 j 赋值
{
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;
}
运行结果:
在这个例子中,变量i具有命名空间作用城,它属于全局命名空间,其有效作用范围到文件尾才结束。在主函数开始处给这个具有命名空同作用域的变量赋初值5.接下来在子块1中又声明了同名变量并赋初值7。第一次输出的结果是7.这是因为具有局部作用域的变量i把具有命名空间作用域的变量i隐藏了,具有命名空间作用域的变量i,变得不可见(这是下面要讨论的可见性问题)。当程序运行到块1结束后,进行第二次输出时,输出的就是具有命名空同作用域的变量i的值5。变量j也具有命名空间作用域,它被声明在命名空间Ns中,在主函数中通过Ns::j的方式引用,为其赋值,接下来在块1中,通过using namespace Ns使得该命名空间的标识符可以在该块中被直接引用,因此输出j时可以直接使用标识符j.