namespace?命名空间?来让我们划清界限!

目录

前言

一、理解命名空间

二、命名空间的定义

1.基本定义

2.嵌套定义

3.命名空间合并

三、命名空间中成员的使用

1.加命名空间名称及作用域限定符

2.使用using将命名空间中某个成员引入

3.使用using namespace 命名空间名称引入

四、小结


前言

学C++之前,一看别人的C嘎嘎代码,老是有一句那什么 "using namespace std"。脑子里不禁想问:这啥呀这是?现在,我们就来看看,这namespace师傅到底是做什么工作的。

一、理解命名空间

来看C++相关内容,相信诸君对C语言的理解已经入木三分了。既然C++是兼容C的,变量、函数、巴拉巴拉一些有名字的东西,那肯定,也是有的。就像你室友有衣服、有裤子、有袜子。那么问题来了,有一天全宿舍的袜子都混在一起了,它们长得还一样,这可怎么分辨呦?总不能闻味儿吧?早知道提前把自己袜子装好了。诶,命名空间表示,咱就是干这行的!

namespace就是命名空间,使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突或名字污染。

屏幕前的你:说人话!

我:拿袜子举例!

简单点说,就是给你的变量,函数这些你起过名字的东西,给它装到盒子里,写上你的名字,防止和别人的混在一起窜味儿喽。

在C语言中,袜子这个变量你定义好了,就不能再定义一个一模一样的,不然判你重定义。但是,这可是C++啊,多两个plus可不是吃醋的。接下来让我们看看C++的命名空间怎么解决这种问题。

二、命名空间的定义

1.基本定义

命名空间就像结构体一样,“关键字+名称+花括号”就定义好了(但是最后不用加分号,你写结构体记得加分号!):

//定义一个名为box(收纳盒)的命名空间
namespace box1
{
    //命名空间中可以定义变量
    int lonly; //定义了个寂寞
    //命名空间可以定义函数
    void fold()
    {
        printf("宝宝把袜子叠起来!");
    }
    //可以定义类型
    struct socks //定义了一个袜子(socks)类型
    {
        int smell; //袜子的味道
        int num; //袜子的数量
    };
}

可以看到,我们在命名空间里定义了个寂寞(变量),还定义了个函数。这样就好了,你的袜子不会和别人的袜子冲突了,因为别人的命名空间可能叫box2,box3,反正跟你的不一样就行了。咳咳,谁让C++兼容C呢,为了防止有宝宝看不懂,我们直接倒车用printf!

2.嵌套定义

正所谓万物皆可套娃(——鲁迅),收纳盒里还能套收纳盒呢,这命名空间里也能套命名空间:

//命名空间可以嵌套
namespace box1
{
    int lonly1;
    void fold1()
    {
         printf("记得叠袜子");
    }
    namespace box2 //box1里面套了个box2
    {
         int lonly2;
         int fold2()
         {
             printf("记得洗袜子");
         }
    }
}

3.命名空间合并

这namespace还挺聪明。收纳盒不仅能套娃,两个一样的收纳盒还能粘在一起当一个用!真有你的:

//命名空间可以合并
namespace box
{
    int lonly1;
    void fold1()
    {
         printf("记得叠袜子");
    }
}
namespace box
{
    int lonly2;
    int fold2()
    {
        printf("记得洗袜子");
    }
}

这样定义出来的box是同一个命名空间,其中的变量和函数也被合并到一起了。相当于你的袜子盒和室友粘在一起共用了。所以,这时候你最好能直接区分你和室友的袜子,别把两个box里的变量定义成一样的!

三、命名空间中成员的使用

命名空间成员有三种使用方式:加命名空间名称及作用域限定符、使用using将命名空间中某个成员引入、使用using namespace 命名空间名称引入。

屏幕前的你:说人话!

狗语翻译器:从收纳盒拿袜子穿有三种方式:我穿的时候到盒子里拿、我先拿出来一个放床上到时候再穿、我直接把袜子倒出来想穿的时候选一个穿。

1.加命名空间名称及作用域限定符

也就是“我穿的时候到盒子里拿”。使用“命名空间::成员名称”这种方式使用成员:

int main()
{
    printf("%d\n", box::sock); //命名空间::成员名称
    return 0;
}

2.使用using将命名空间中某个成员引入

也就是“我先拿出来一个放床上到时候再穿”。在使用之前,先用“using 命名空间::成员名称”的方式把成员拿出来,什么时候要用到直接用就行。

using box::sock; //先把袜子拿出来,后面要穿
int main()
{
    printf("%d\n", box::sock); //可以用第一种方式
    printf("%d\n", sock); //也可直接使用
    return 0;    
}

3.使用using namespace 命名空间名称引入

也就是“我直接把袜子倒出来想穿的时候选一个穿”。使用前,先用“using namespace 命名空间;”(有分号!有分号!)把命名空间里所有东西全都倒出来,后面再使用。

using namespce box;
int main()
{
    printf("%d\n", box::sock); //第一种方式还是能用
    printf("%d\n", sock); //可以直接用变量
    fold(10, 20); //也可以直接用函数
    return 0;    
}

四、小结

其实,std就是C嘎嘎的一个命名空间,里面有很多有关输入输出的变量和函数。开局“using namespace std;”其实就是把std里面所有东西都倒出来了,可以随便使用,但是既然倒出来了,你再定义跟它一样的东西,就要窜味儿了。现在,你知道了什么是namespace和命名空间,namespace就是命名空间,可以帮助我们和别人划清界限!命名空间定义有三种模式:直接定义、套娃、拼接,命名空间成员的使用有三种方法:我拿出来就用、我先拿出来一个之后再用、我全都倒出来用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值