眾所周知,c++作為一種物件導向的語言,當中的變數、函式、類都是大量存在的。假如這些變數、函式、類的名稱都存在於全域性作用域當中,就可能會導致很多衝突。舉個形象的例子,乙個學校有三個年級 ,乙個年級有三個班,很巧的是這個學校的每個年級的每個班級裡都有乙個叫小明的學生。這個學校就相當於乙個全域性作用域,當中的年級和班級就相當各種變數、函式和類。假如這時候校長從廣播裡喊話:「小明同學,請到我辦公室來一下。」搞不好9個小明還都真一塊過去了。這就像一些變數、函式和類在全域性作用域中起了衝突。那麼校長正確的叫法應該是什麼呢?當然是:「某年級某班的小明同學請過來我辦公室一下。」這樣會過去的只有那乙個真正被找的小明了,那麼當中的某年級某班就是我們的命名空間啦。它的目的就是為了對識別符號的名稱進行本地化,從而避免命名衝突或名稱汙染,通俗的來講就是乙個由程式設計者命名的記憶體區域,程式設計者可以根據需要指定一些有名字的空間域,把一些全域性實體分別放在各個命名空間中,從而與其他全域性實體分隔開來。
命名空間的定義使用關鍵字namespace,後跟命名空間的名稱:
namespace namespace_name
1.建立乙個普通命名空間:
//建立乙個普通命名空間ns1
namespace ns1
}
2.建立乙個巢狀命名空間(命名空間可以巢狀):
//建立乙個巢狀型別的命名空間ns2,ns3巢狀在ns2當中
namespace ns2
namespace ns3 }
}
注意:因為命名空間中的所有內容都只侷限於該命名空間中,故巢狀命名空間下同名變數不互相影響。例如:
cout << "ns2::ns3::a:" << ns2::ns3::a << endl;
cout << "ns2::a:" << ns2::a << endl;
3.建立乙個名稱同為ns1的命名空間(在同乙個工程中允許存在多個相同名稱的命名空間,編譯器最後會將這些命名空間合成到同乙個命名空間中):
//建立乙個名稱同為ns1的命名空間
namespace ns1
}
printf("%d\n", a);
//會導致編譯出錯:無法識別的字元
1.使用命名空間名稱及作用域限定符::訪問命名空間:
//利用作用域限定符訪問ns2命名空間中的成員變數a
printf("%d\n", ns2::a);
2.使用using引入命名空間成員:
//使用using關鍵字引入命名空間ns2中的成員a,然後直接可訪問a
using ns2::a;
printf("%d\n", a);
3.使用using namespace引入命名空間:
//使用using namespace引入命名空間ns2中的所有成員,並對其直接使用
using namespace ns2;
printf("%d\n", a);
add(3, 4);
相信大家的第乙個c語言程式一定是向世界say:hello world!那麼我們的c++是不是也應該同世界問個好呢?了解了命名空間的概念以及用法,下面讓我們一起來學習一下c++當中的輸入和輸出吧!
#includeusing namespace std;
int main()
}//建立乙個巢狀型別的命名空間ns2,ns3巢狀在ns2當中
namespace ns2
namespace ns3 }
}//建立乙個名稱同為ns1的命名空間
namespace ns1
}int main()
C 基礎6 命名空間
背景 c 中,名稱可以是變數 函式 結構 列舉 類以及類和結構的成員。當隨著專案的增大,名稱相互衝突的可能性也將增加。例如許多廠商的類庫,可能導致名稱衝突。這種衝突被稱為命名空間問題。解決措施 c 標準提供了命名空間工具 以便更好地控制名稱的作用域。介紹一些術語,熟悉命名空間的概念 宣告區域 dec...
c 作用域及命名空間
什麼是作用域 每乙個變數 函式 陣列 結構體 類 等實體都有其自己有效的作用範圍,這就是變數的作用域。在區域性變數中,區域性變數只在定義的函式範圍內有效 即從變數定義開始到函式結束被釋放。int fun a的作用域結束 在全域性變數中,全域性變數的作用域為從定義變數的位置開始到本原始檔結束。若全域性...
c 命名空間及標頭檔案
命名空間是1998c 標準新增特性 c 自98才標準化 命名空間 用來解決不同模組可能有識別符號衝突的問題。c 標註庫使用了乙個命名空間std,即c 標註庫中所有的識別符號都定義在命名空間std中。使用c 標註庫中的任何識別符號的方式有三種 1.直接指定識別符號號 如 std cout 標頭檔案he...