作用域的定义

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

1.函数原型作用域

在函数原型声明时形式参数的作用范围就是函数原型作用域。
它是C++程序中最小的作用域。
例:

double area(double radius);

其中radius的有效范围就在area形参列表的左右括号之间,在程序的其他地方不能引用这个标识符。

2.局部作用域

void fun(int a)
{
    int b=a;
    cin>>b;
    if(b>0)
    {
        int c;
        ......
    }
}

其中a的作用域为整段程序,b、c的作用域从声明处开始,到其所在的块结束。块就是一对发括号所括起来的一段程序。
函数体内声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止。
具有局部作用域的变量也称局部变量。

3.类作用域

一个类就是一个独立的作用域,在类外定义函数或静态变量需要加上类名和作用域符号。每个类的成员不同于任何其他类的成员。
在类作用域之外,成员只能通过对象或指针分别使用成员访问操作符,或使用-> 来访问(此处这篇博客里不详述)。
例:

void Complex::get() {
    ......
}

一般的数据或函数成员必须通过对象来访问。

4.命名空间作用域

什么是命名空间呢?一个大型程序通常由不同模块构成,不同模块中的类和函数可能发生重名,这样就会引发错误。
命名空间就是为了消除这样的错误而存在。

(1)命名空间分类:

系统命名空间: std
自定义的命名空间:

如:

namespace NS
{
    ......
}

一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的,都属于该命名空间作用域。
命名空间也允许嵌套。
如:

namespcace OuterNS{
    namespace InnerNS{
        {
            class SomeClass{...};
        }
}

若想引用SomeClass类,需要使用如下形式:

OuterNS::InnerNS::SomeClass

此外还有两类特殊的命名空间
全局命名空间和匿名命名空间
全局命名空间是默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中。
匿名命名空间是一个需要显式声明的没有名字的命名空间,声明方式如下:

namespace {
匿名命名空间内的各种声明(函数声明、类声明......
}

(2)命名空间的使用

使用命名空间:
①通过作用域符  空间名::空间成员
②声明命名空间:  using namespace 命名空间 ;

(3)实例

# 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; 
}

//运行结果:
//i=7
//j=6
//i=5

具有命名空间作用域的变量也称全局变量。