C++自制心得——开篇(命名空间篇)
前言:
本心得只适合给那些拥有C语言基础 (系统的自主学习过C语言(以找工作为目标,学校老师教的一律视作没学),了解一些底层机制,用C实现过一些基本数据结构 (顺序表、链表、队列与栈、初等二叉树、十大经典排序等) ) 的人观看。如果你不满足上述条件就不要在这里浪费时间了。
本人在写专栏上的技术力并不好,如果你觉得这篇文章在排版上有需要改进的地方可以在评论区留言并附上具体操作流程。
本人目前是大二在读生,目前刚开始学习C++相关知识,如果有大佬发现哪里介绍的不对或者有疏漏欢迎在评论区留言,我尽量在发现的第一时间纠正。
好,废话不多讲,我们进入正题。
众所周知,C++是C的豪华升级版,它在C语言的基础上填补了一系列漏洞,并增加了很多新机制,我们先介绍一些给C语言打的补丁。
正文
我们先给一段代码

显然,现在这段代码可以正常使用,没有问题。but......看看下面这个。

请看划红线的地方,rand重定义,以前定义为函数。为什么?因为我们多包含了一个名为stdlib.h的头文件,其中定义了一个名为rand的函数,而我们也定义了一个名为rand的int全局变量,名字重了。
我知道你想说什么,正常人不会定义一个名为rand的变量,自然也不会出现这种低级错误。但随着你包含的官方库文件和自定义库文件数量的增加,出现这类问题的几率也会变大。更糟的是,C语言本身不提供此类问题的解决方案。官方库文件还可以避着走,你同事写的库文件怎么办,难不成和他在线下激情开撕,谁输了谁改名。嗯,看来程序员也要练Chinese kungfu,人人都要练成能手撕鬼子的超人ε=(´ο`*)))。
为了节省广大程序员的医药费,C++加入了命名空间,快说谢谢。


就像这样,现在恼人的重定义问题终于被解决了......至少是部分,因为还有一些小细节。不过在此之前我们先讲讲命名空间的基本用法。



可以看到,命名空间的基本用法还是很容易理解的,创建一个域,把代码放进去,用的时候只需在变量前+命名空间名和::就行。
(tips: 如果没在二叉树节点的定义用typedef偷鸡,那main函数里的代码应该写成: struct test:: BinaryNode Node)
命名空间的展开
命名空间相当于一个权限锁,编译器在没有授权的情况下(无::修饰)只会去公共空间寻找定义,有了授权它就只会去命名空间寻找定义(找不到就报错),那有没有一次性解锁的方式?老是写::太烦了。命名空间的展开可以帮助解决这个问题。


这就是一个命名空间的全展开,很简单用一下using关键字就可以了。
恼人的重定义问题终于被解决了......至少是部分
实际上命名空间的展开是一种很危险的行为,因为开放权限后命名空间里的内容就直接进入公共空间了,如果此时你的公共空间里有重复定义,那重定义问题就叕叒双又来了。


那还有别的方法吗?我就不想写六次::。那就试试半展开。


完美,代码看着舒服多了。(tips: 其实只用在rand的前面加上::就能解决问题,没必要半展开)