轉載:http://www.cnblogs.com/autocrat/archive/2010/05/05/1727630.html
https://blog.csdn.net/quyafeng2011/article/details/68921750
1.概念
和<iostream.h>是不一樣的,前者沒有後綴,實際上,在你的編譯器include文件夾裏面可以看到,二者是兩個文件,打開文件就會發現,裏面的代碼是不一樣的。
後綴爲.h的頭文件c++標準已經明確提出不支持了,早些的實現將標準庫功能定義在全局空間裏,聲明在帶.h後綴的頭文件裏,c++標準爲了和C區別開,也爲了正確使用命名空間,規定頭文件不使用後綴.h。
因此,當使用<iostream.h>時,相當於在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;當使用的時候,該頭文件沒有定義全局命名空間,必須使用namespacestd;這樣才能正確使用cout。
2.C++標識符
所謂namespace,是指標識符的各種可見範圍。
C++標準程序庫中的所有標識符都被定義於一個名爲std的namespace中。
由於namespace的概念,使用C++標準程序庫的任何標識符時,可以有三種選擇:
1.直接指定標識符。
std::cout << std::hex<< 3.4<< std::endl;
2.使用using關鍵字。
using std::cout;
using std::endl;
cout << std::hex<< 3.4<< endl;
3.使用using namespace std。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
cout << hex<< 3.4<< endl;
因爲標準庫非常的龐大,所程序員在選擇的類的名稱或函數名時就很有可能和標準庫中的某個名字相同。所以爲了避免這種情況所造成的名字衝突,就把標準庫中的一切都被放在名字空間std中。但這又會帶來了一個新問題。無數原有的C++代碼都依賴於使用了多年的僞標準庫中的功能,他們都是在全局空間下的。
所以就有了<iostream.h>和等等這樣的頭文件,一個是爲了兼容以前的C++代碼,一個是爲了支持新的標準。命名空間std封裝的是標準程序庫的名稱,標準程序庫爲了和以前的頭文件區別,一般不加".h"
3.如何使用
常用的是using namespace std,就是說用C++的標準名字空間。
你也可以引用你自己的名字空間。比如說:
import "C:\\MyTest\\test.tlb"
using namespace CMyTest
就可以引用CMyTest內的各個類型名。
4.避免衝突
因爲標準庫非常的龐大,所程序員在選擇的類的名稱或函數名時就很有可能和標準庫中的某個名字相同。所以爲了避免這種情況所造成的名字衝突,就把標準庫中的一切都被放在名字空間std中。但這又會帶來了一個新問題。無數原有的C++代碼都依賴於使用了多年的僞標準庫中的功能,他們都是在全局空間下的。
所以就有了<iostream.h>和等等這樣的頭文件,一個是爲了兼容以前的C++代碼,一個是爲了支持新的標準。
namespace是爲了解決C++中的名字衝突而引入的。
什麼是名字衝突呢?比如,在文件x.h中有個類MyClass,
在文件y.h中也有個類MyClass,而在文件z.cpp中要同時
引用x.h和y.h文件。顯然,按通常的方法是行不能的,
那怎麼辦呢?引入namespace即可。例如:
在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();
}