C++ 名称空间

本文介绍了C++中的名称空间(namespace)机制,用于解决多厂商类库导致的名称冲突问题。名称空间通过定义不同的作用域来组织代码,可以避免变量和函数的命名冲突。using声明和using编译指令则提供了访问名称空间中特定标识符或整个名称空间的方法。此外,还讨论了嵌套名称空间、给名称空间创建别名以及未命名的名称空间的用法。
摘要由CSDN通过智能技术生成

一、背景

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

 

二、一些术语

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

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

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

 

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

 

三、名称空间

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

 

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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云霄星乖乖的果冻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值