您的位置:首页 > 编程语言 > C语言/C++

C++std命名空间详解

2015-07-19 15:11 337 查看
转自http://qiusuoge.com/9811.html

什么是命名空间

在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间,可使整个系统更加模块化,最重要的是它可以防止命名冲突。就好比在两个函数或类中定义相同名字的对象一样,利用作用域标示符限定该对象是哪个类里定义的。

C++中的命名空间定义

在C++语言中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域,例如:

namespace foo{

int num=0;

}


C++中的std命名空间

std命名空间是C++中标准库类型对象的命名空间。

在标准C++以前,都是用#include

#include <iostream.h>

using namespace std;


所以 要么写成

#include <iostream>

using std::cout;

using std::cin;

using std::cerro;


要么写成

#include <iostream.h>


当然最好是前种,因为后种情况如果遇到用户定义的标示符在头文件中已经定义,可能会导致错误,采用using namespace std也是如此。

命名空间实际上是一个作用域

例如:

在x.h中的内容为

// x.h
namespace MyNamespace1
{
class MyClass
{
public:
void f();
private:
int m;
}
};


在y.h中的内容为

// y.h
namespace MyNamespace2
{
class MyClass
{
public:
void f();
private:
int m;
}
};


然后在z.cpp中引入x.h和y.h

// z.cpp
#include "x.h"
#include "y.h"

void z::f()
{
//声明一个文件x.h中类MyClass的实例x
MyNamespace1::MyClass x;
//声明一个文件x.h中类MyClass的实例x
MyNamespace2::MyClass y;

//调用文件x.h中的函数f
x.f();
//调用文件y.h中的函数f
y.f();
}


使用标准库中标示符的方法

使用标示符限定命名空间:

std::cout<<"Hello!"<<endl;


使用using std::cout;事先声明:
cout<<"Hello!"<<endl;
//分别引入,需要用哪个引用哪个,保证程序中名称的唯一性

使用using naspace std声明:
cout<<"Hello!"<<endl;
//引入名字空间的所有内容,不推荐这样写

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了
<iostream.h>
<iostream>
等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准库的名称,标准库为了和以前的头文件区别,一般不加”.h”

C++语言是从C语言发展起来的,因此有很多借鉴的地方。当C++语言推出但尚未标准化以前(98年才标准化),市场上已经有了很多版本的程序库了,各库林立,导致互相应用时出现了一个很难调和的难题,那就是命名冲突,又称名空间泛滥。比如某个库写了个函数line(int x,int y);不巧另外一个库又写了个类class line;这下编译器该匹配哪个呢?只好取决于哪个库文件先被引用到文件中,并且把另外一个完全屏蔽掉。这显然不是一个好的方法。在标准库的产生过程中,这个问题被提了出来。为此,标准库组织决定在标准库中引入名空间的概念,所有标准库的组件都在名空间std中定义,由用户手动引入到程序中,这样就让编译器知道,当遇到一个可能冲突的名称时,以标准库中定义的名称为主,如果想用标准库外定义的名称,那程序员需要自己注明另外的名空间,从而达到消除名空间泛滥的目的。using namespace std;的写法引入了名空间的所有内容,这是一种简单但不保险的做法,是标准库组织不推荐这么做的。因为这样引入了所有的组件函数名,相当于重新引发了名字空间泛滥的问题。为此,好的做法应该是第二种分别引入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++