命名空间(像std那样定义属于自己的专属空间)

使用命名空间的目的对标识符的名称进行本地化,以避免命名冲突。

其实命名空间我们一直都在用,例如:using namespace std; using namespace cv;等等。使用它们就是为了为了给它们之中的成员限定一个范围。下面我来详细介绍一下命名空间。

1、命名空间的创建

namespace 关键字使得我们可以通过创建作用范围来对全局命名空间进行分隔。本质上来讲,一个命名空间就定义了一个范围。定义命名空间的基本形式如下:

namespace 名称{//声明}

在命名空间中定义的任何东西都局限于该命名空间内。

创建命名空间的办法很简单,先写出关键字namespace,再写出这个命名空间的名字,然后把这个命名空间里的东西全部括在一对花括号里就行了,如下所示:

namespace myNamespace{// 全部东西}

注意在最末尾不需要加上分号哦。

 

正如我们刚才讲过的那样,命名空间可以让你使用同一个标识符而不会导致冲突:

namespace author
{
std::string person;
} 
namespace programmer
{
std::string person;
}

2、使用命名空间 

如果某个东西是在命名空间里定义的,程序将不能立刻使用它。

这正是命名空间的全部意义所在:把东西放在它们自己的小盒子里,不让它们与可能有着相同名字的其他东西发生冲突。

3、using关键字

如果在程序中需要多次引用某个命名空间的成员,那么按照之前的说法,我们每次都要使用范围解析符来指定该命名空间,这是一件很麻烦的事情。为了解决这个问题,人们引入了using关键字。using语句通常有两种使用方式:

using namespace 命名空间名称; //例如:using namespace std;

using 命名空间名称::成员; //例如:using std::cout;

第一种形式中的命名空间名称就是我们要访问的命名空间。该命名空间中的所有成员都会被引入到当前范围中。也就是说,他们都变成当前命名空间的一部分了,使用的时候不再需要使用范围限定符了。

第二种形式只是让指定的命名空间中的指定成员在当前范围中变为可见。

 

我们可以使用这种没有名称的命名空间创建只有在声明他的文件中才可见的标识符。也即是说,只有在声明这个命名空间的文件中,它的成员才是可见的,它的成员才是可以被直接使用的,不需要命名空间名称来修饰。对于其他文件,该命名空间是不可见的。我们在前面曾经提到过,把全局名称的作用域限制在声明他的文件的一种方式就是把它声明为静态的。尽管C++是支持静态全局声明的,但是更好的方式就是使用这里的未命名的命名空间。

4、std命名空间

标准C++把自己的整个库定义在std命名空间中。

using namespace std;

这样写是为了把std命名空间的成员都引入到当前的命名空间中,以便我们可以直接使用其中的函数和类,而不用每次都写上std::

当然,我们是可以显示地在每次使用其中成员的时候都指定std::,只要我们喜欢。例如,我们可以显示地采用如下语句指定cout

std::cout << “显示使用std::来指定cout”;

如果我们的程序中只是少量地使用了std命名空间中的成员,或者是引入std命名空间可能导致命名空间的冲突的话,我们就没有必要使用using namespace std;了。然而,如果在程序中我们要多次使用std命名空间的成员,则采用using namespace std;的方式把std命名空间的成员都引入到当前命名空间中会显得方便很多,而不用每次都单独在使用的时候显示指定cout。

 

5、用户自定义命名空间的定义与使用(强烈推荐看此部分内容)

我们有时候会在头文件中定义自己的命名空间,那么一定要注意该命名空间的范围:

#ifndef XX_H
#define XX_H
//
//
#endif

如果是这样的结构呢,我们一般在定义命名空间时是这样限定命名空间的:

#ifndef XX_H
#define XX_H
 
namespace Myspace
{
int count;
//
//
}
#endif

用户自定义命名空间的使用(想要访问在某个命名空间里定义的东西):

我们刚才定义的命名空间名称Myspace就相当于C++中的std命名空间,使用方法也与它完全相同。

方法一:直接在代码前面写上:using namespace Myspace;

表明该命名空间中的所有成员都会被引入到当前范围中。也就是说,他们都变成当前命名空间的一部分了,使用的时候不再需要使用范围限定符了。

方法二:using 命名空间名称::成员; //例如:using Myspace::count;

using std::cout;

cout << “I love fishc.com\n”;

这种形式只是让指定的命名空间中的指定成员在当前范围中变为可见。

方法三(推荐使用):是用一个using指令只把你需要的特定命名从命名空间提取到全局作用域:

直接在使用命名空间中的成员时使用“范围解析运算符 ::

例如:std::cout<<直接使用<<std::endl;

Myspace::count=80;//为命名空间中的变量赋值

总结:在以往的编程过程中,我们经常使用第一种方法,但是这种方法似乎失去了命名空间的实际意义,所以我推荐使用方法三,虽然这种方法在写法上比较麻烦,但是它真正体现了命名空间的优势,而且使得别人在查看你的代码时更加清晰。

 

重要性质:

1、在命名空间之外想要访问命名空间内部的成员需要在成员前面加上命名空间和范围解析运算符

2、相同的空间名称是可以被多次声明的,这种声明向相互补充的。这就使得命名空间可以被分割到几个文件中甚至是同一个文件的不同地方中

3、命名空间是可以嵌套的。也就是说可以在一个命名空间内部声明另外的命名空间。

最后请务必注意:using指令的出现位置决定着从命名空间里提取出来的东西能在哪个作用域内使用。

如果你把它放在所有函数声明的前面,他将拥有全局性,如果你把它放在某个函数里,那么它将只在这一个函数里可以使用。

 

 

本文参考:http://blog.chinaunix.net/uid-26874138-id-3215266.html


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值