一.C语言缺陷之命名冲突
看下面的代码
这里面报错说是rand类型重定义了。这是为什么呢?因为stdlib.h中已经定义了rand,而在打印时,它是在全局寻找rand,发现有两个rand,就是重定义。
那么发明c++的大佬本贾尼发现了这一bug,就开创出了命名空间这一个语法。
二.命名空间的定义
命名空间需要使用namespace关键字,后跟空间的名字,再加一对{},括号中就是这个空间内的成员
命名空间就相当于在全局中圈出一块位置,相当于在山上圈出一块地,有人承包改造成菜园。
三.命名空间的使用
1.命名空间中可以定义变量,函数,类型
2.命名空间的使用
方式一:加命名空间名称以及作用域限定符
这是一个打印语句(后面会讲到),要想打印zyh中的rand,就要加上作用域限定符::,表示到zyh这块空间中寻找变量rand,而不是去全局中找库中的rand。这就好像拿到裁员中的钥匙,打开裁员去摘菜。
但要是没有指定命名空间,就会去全局寻找,这里的全局是将命名空间除外,因为命名空间是被别人承包的菜园,没有许可不可以进入。
方式二:使用using将整个命名空间引入
这个操作就是展开命名空间,就好像直接将菜园放开,所有人都既可以摘菜园以外的庄稼又可以摘菜园中的菜。
所以这时候rand就又不能使用了,因为菜园以外有rand,菜园中也有rand,重复了。
方式三:使用using将命名空间中的某个成员引入
有些时候,命名空间中的成员太多,但是真正使用到的只有那几个,这时就可以如下:
但是下面这个就会报错:
这是为什么呢?不是引入命名空间了吗?为什么还会有多次声明?因为,只要不是把整命名空间引入,那编译器就是在全局(标准库)以及引入的变量中寻找rand,所以就会导致rand重定义
3.注意事项
1.如果有两个同名的命名空间,那么最后就会将这两个命名空间进行合并,变成一个命名空间
2.命名空间可以套用
命名空间中也可以定义命名空间
四.命名空间的应用之输入与输出
前面我们用到了cout,其实他就是一个标准输出对象
1.cin,cout
这两个是流对象,cin是标准输入对象(键盘),cout是标准输出对象(控制台)它们其实是定义在std这个命名空间中,而这个命名空间定义在iostream头文件中,所以在使用时要引入iostream头文件,并且要用上面讲到三种方式使用std这个命名空间。
2.endl
它是一个特殊的c++符号,表示换行输出,也在std中,它也可以使用'\n’来代替
3.<<是流插入运算符 >>是流提取运算符
4.c++的输入输出比C语言更方便,可以自动识别类型
不像printf,scanf那样需要手动控制格式