目录
前言
学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就是命名空间,可以帮助我们和别人划清界限!命名空间定义有三种模式:直接定义、套娃、拼接,命名空间成员的使用有三种方法:我拿出来就用、我先拿出来一个之后再用、我全都倒出来用。