C++ 名称空间

一、背景

使用多个厂商的类库时,可能导致名称冲突。

 

二、一些术语

声明区域:可以在其中进行声明的区域。函数外定义的,声明区域为所在文件;函数内定义的,声明区域为所在的代码块。

潜在作用域:从声明点开始,到其声明区域的结尾。

作用域:变量对程序而言可见的范围。(在潜在作用域,变量有时不可见,如局部变量隐藏全局变量)

 

声明区域>潜在作用域>作用域

 

三、名称空间

1.名称空间的创建

创建一个名为Jill的名称空间

namespace Jill{
    int pal;
    double fetch;
    double bucket();
    struct Hill{...};
}

名称空间是开放的

(1)可以把名称加入到已有的名称空间中

namespace Jill{
    char goose(const char*);
}

(2)可以在之后提供函数代码

namespace Jill{
    double bucket()
    {
        ...
    }
}

 

2.名称空间的位置

(1)全局

(2)另一个名称空间中(嵌套式名称空间)

namespace elements
{
    namespace fire
    {
        int flame;
        ...
    }
    float water;
}

注:名称空间不能位于代码块中!

 

3.using声明和using编译指令

区别      

(1)                       

using声明   使特定的标识符可用,如using Jill::fetch                    

using编译指令   使整个名称空间可用,如using namespace Jill   

(2)当函数中已有某名称时

using声明   不能导入相同名称

using编译指令   可导入,且局部名称将隐藏名称空间名

 

注:如果函数被重载,将导入所有的版本

 

使用

(1)函数中使用:使名称在函数中可用

namespace Jill{
    double fetch;
}

int main()
{
    using Jill::fetch;
    cin>>fetch; //read a value into Jill::fetch
}

(2)函数外使用:使名称在全局中可用

using Jill::fetch;

int main()
{
    cin>>fetch;
    other();
}

void other()
{
    cout<

 

4.访问名称空间中的名称

用作用域解析运算符 ::

Jill::pal=12;
Jill::bucket();

假如同时有名称空间变量、全局变量、局部变量

namespace Jill{
    double fetch;
}

char fetch;

int main()
{
    using namespace Jill;
    double fetch;

    cin>>fetch;//访问局部变量
    cin>>::fetch;//访问全局变量
    cin>>Jill::fetch;//访问名称空间中变量
    ...
}  

 

5.嵌套式名称空间

以2中为例:

namespace elements
{
    namespace fire
    {
        int flame;
        ...
    }
    float water;
}

(1)可在名称空间中使用using

namespace myth
{
    using Jill::fetch;
    using namespace elements;
    using std::cout;
    using std::cin;
}

(2)访问名称

由于fetch位于Jill中,而Jill:fetch又位于myth中,所以可以这样访问

std::cin>>myth::fetch;
std::cout>>Jill::fetch;

(3)using编译指令可传递

即  using namespace myth;  这条编译指令等价于以下两条编译指令:

using namespace myth;

using namespace elements;

 

6.给名称空间创建别名

namespace my_favorite_things{...}

namespace mft=my_favorite_things;

 

7.未命名的名称空间

namespace
{
    int ice;
}

潜在作用域:从声明点到该声明区域末尾

 

缺点:由于没有名称,所以不能显式地使用using编译指令或using声明来使它在其他位置都可用

作用:可作为链接性为内部的静态变量的替代品,如以下代码:

static int counts;

采用名称空间的方法如下:

namespace
{
    int counts;
}

 

 

你可能感兴趣的:(C++,c++)