C++的命名空间

博客的所有内容都是个人理解,难免有理解错误的地方,欢迎大家多多拍砖!

C++中的命名空间是为了防止命名重复,免除程序猿为想名字而绞尽脑汁的痛苦,具体作用于Java中package相同。

一、命名空间的定义

命名空间可以化为全局的命名空间,将各自的变量和函数封装在自己的命名空间范围内,这样即使各部分存在重名的变量或者函数也不会存在问题。

命名空间以namespace开头,后便节命名空间的名字。在命名空间所在的作用于内,命名空间的名字必须是唯一的,命名空间可以在全局作用域或者局部作用域内定义,但是不能在函数或者类内部定义。

在命名空间内部可以直接使用函数或变量的名字,在外部使用时必须指定所在的命名空间。命名空间可以是不连续的,意思就是说命名空间可以是由在不同文件或者同一文件不同地方的几个小的命名空间组合而成。

有两种比较特殊命名空间。一种是全局命名空间,全局命名空间是隐式声明的,它没有名字,调用只需要::member_name即可。第二种是未命名的命名空间,namespace后边没有具体命名空间的名字,未命名的命名空间可以在指定的文件中不连续,但是不能跨越文件,每个文件都有自己的未命名的命名空间。未命名命名空间的这种特性是因为它是用来存储局部于文件的实体,C++中沿用了C中的static存储局部实体,但是最好使用未命名的命名空间,因为未来的版本可能不在支持static。

一旦出现完全限定的函数名,就处于命名空间之中,跟在类外部定义成员函数一样,只需要函数名的完全限定,之后的形参列表以及函数内存都不需要完整的限定,默认在作用域内部。

二、命名空间的使用

1、using 声明

using声明的作用域从声明点开始,直到包含声明的末尾。如果命名空间的名字过长可以定义它的别名,在程序中要尽量使用using声明,只把用到的特定的成员或者函数进行声明。具体格式:using 命名空间名::变量或者函数。

2、using指示

这个理解起来比较不容易,因为他是将命名空间的成员提升到包含命名空间本身和using指示的最近作用域,首先这句话就不怎么好理解。其实意思可以理解成命名空间和using指示的最小公倍数,当然这只是一个比喻,有助于理解吧。

最好少使用using指示,它比较有用的一个地方就是命名空间本身的实现文件。

有助于理解这个概念一个例子就是C++ primer第四版的17.21例题,截图如下:

C++的命名空间

C++的命名空间