最近正在學習C++,對namespace的概念頗為好奇,但網上資料很零散,又不願意去翻那本厚厚的C++ Primer Plus。遂自己試驗。
1. <iostream>和<iostream.h>是不一樣,前者沒有后綴,實際上,在你的編譯器include文件夾里面可以看到,二者是兩個文件,打開文件就會發現,里面的代碼是不一樣的。
后綴為.h的頭文件c++標准已經明確提出不支持了,早些的實現將標准庫功能定義在全局空間里,聲明在帶.h后綴的頭文件里,c++標准為了和C區別開,也為了正確使用命名空間,規定頭文件不使用后綴.h。
因此,當使用<iostream.h>時,相當於在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;
當使用<iostream>的時候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。
以上來自http://www.jb51.net/article/40018.htm
2.namespace的作用
減少大型軟件的變量函數和類重名的問題。每個namespace都可以隨意命名變量,不用擔心沖突;
namespace space1{ int x; } namespace space2{ int x; }
namespace里亦可添加函數
namespace space1{ int x; } namespace space1{ void alert(){ std::cout<<"hello"; } }
3.如何調用namaspace里的成員
一次性調用所有的 using namespace xxx;
調用其中某些成員
xxx::member
xxx::function()
比如標准庫里
std::cout<<"";
或
using namespace std; cout<<"";
4.namespace的作用域
#include <iostream> using namespace std; int main(){ int name = 8; cout << name; system("pause"); }
其中std里的成員可在全局被調用。但如果using一行在main內,則外部函數定義中不可使用相關內容。
5.namespace的嵌套
譬如以下定義
namespace layer1{ int x; namespace layer2{ int y; } }
如何調用layer2中的內容?
using namespace layer1; using namespace layer2;
如果順序反過來便會報錯;
或者采用
Layer1::layer2::x
的方法來局部調用;
6.如果已經引入namespace后又聲明了相同的變量,則使用新聲明的變量。
#include <iostream> using namespace std; namespace test{ int name = 4; } int main(){ using namespace test; int name = 8; cout << name; system("pause"); }
該程序運行結果為8。
7.未命名的namespace
namespace { int x; }
等效於
static int x;
默認值都已經初始化為0。