C++ namespace命名空間解析
命名空間 namespace
#include<iostream> int rand = 0; int main() { printf("%d", rand); return 0; }
上述代碼一定會出現(xiàn)以下情況:
原因: 自己定義的rand變量為某一庫函數(shù)里面已經(jīng)聲明過的函數(shù),意思就是你自己定義的東西跟庫函數(shù)的東西重復(fù)了。這種錯誤就是命名沖突。
命名沖突問題:
- 我們自己定義的變量、函數(shù)可能跟庫里面重名沖突。
- 進(jìn)入公司項(xiàng)目組后,做的項(xiàng)目通常比較大,多人協(xié)作,可能命名沖突。
C語言沒有辦法很好的解決這個問題。
C++提出了一個新語法:命名空間
命名空間的定義
對于上面的問題我們使用命名空間來解決:
#include<iostream> namespace zzy { int rand = 0; } int main() { printf("%d", zzy::rand); return 0; }
我們使用namespace來劃定一個區(qū)域,叫做域,域的名字叫zzy(名字可以自己定義,但是最好不要跟庫已有的重復(fù))。這個域就像是隱身衣一樣,讓系統(tǒng)編譯的時(shí)候不會去這個區(qū)域里面讀取。
:: 為域作用限定符,前面是命名空間的名稱,后面是命名空間里的變量、類型、函數(shù)等。使用這個限定符來指定我們使用的是哪個命名空間里的變量
需要注意的一點(diǎn)是,命名空間是全局的,必須要寫在main函數(shù)的外邊。
下面舉些例子來幫大家更清晰的了解命名空間:
1. 函數(shù)定義在命名空間里
#include<iostream> namespace zzy { int Add(int x, int y) { return x + y; } } int main() { printf("%d\n", zzy::Add(1, 2)); return 0; }
如果把函數(shù)的定義寫在命名空間的外面,而函數(shù)聲明在命名空間里面會怎么樣?由于命名空間會屏蔽掉,相當(dāng)于你沒有寫這個聲明。但是如果你的函數(shù)定義寫在main函數(shù)的上面就沒什么問題了。
#include<iostream> namespace zzy { int Add(int x, int y); } int Add(int x,int y) { return x+y; } int main() { printf("%d\n",/*zzy::*/Add(1, 2)); return 0; }
一點(diǎn)要注意,這個時(shí)候你不可以寫zzy::了,因?yàn)槿绻氵@么寫的話系統(tǒng)會優(yōu)先去zzy命名空間里去尋找,發(fā)現(xiàn)只有函數(shù)的聲明,沒有函數(shù)的定義,所以是沒結(jié)果的。
2.對全局變量使用命名空間
#include <iostream> int a = 0; int main() { int a = 10; printf("%d",::a);//使用全局作用域的a,::前面的沒有東西代表全局作用域 }
3.命名空間的嵌套
#include <iostream> namespace zzy { int a = 10; namespace N1 { int b = 20; } } int main() { printf("%d\n",zzy::a); printf("%d\n",zzy::N1::b); }
4.using命名空間
我們發(fā)現(xiàn),每次使用一些命名空間里的變量總是要加上”命名空間名稱::”,當(dāng)變量多時(shí),就會顯得很繁瑣。所以我們可以這么做:
#include <iostream> using namespace zzy { int count = 12; int Add(int x,int y) { return x+y; } } //解放了整個zzy空間,使里面的變量等變得不隱身了 using namespace zzy; int main() { printf("%d",count); printf("%d",Add(1,2)); }
也可以解放一部分變量、函數(shù)等:
#include <iostream> using namespace zzy { int count = 12; void B() { int cur = 0; } } //只解放了一部分變量 using zzy::B::cur; int main() { printf("%d",zzy::count); printf("%d",cur); }
5.命名空間里的結(jié)構(gòu)體
#include <iostream> using namespace zzy { int count = 0; struct Node { int val = 0; }; } int main() { struct zzy::Node node;//注意::的位置,我們要找的是Node node.val = 12; printf("%d\n", node.val); }
到此這篇關(guān)于C++ namespace命名空間解析的文章就介紹到這了,更多相關(guān)C++ 命名空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?std::chrono庫使用示例(實(shí)現(xiàn)C++?獲取日期,時(shí)間戳,計(jì)時(shí)等功能)
std::chrono是C++標(biāo)準(zhǔn)庫中的一個組件,用于表示和處理時(shí)間,這篇文章主要介紹了C++?std::chrono庫使用指南(實(shí)現(xiàn)C++?獲取日期,時(shí)間戳,計(jì)時(shí)等功能),需要的朋友可以參考下2023-06-06C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程實(shí)例
這篇文章主要介紹了C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10C++ Boost PropertyTree示例超詳細(xì)講解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用
這篇文章主要介紹了詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08C語言實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C語言實(shí)現(xiàn)手寫Map(全功能)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)手寫Map(全功能),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-08-08從頭學(xué)習(xí)C語言之for語句和循環(huán)嵌套
這篇文章主要為大家詳細(xì)介紹了C語言之for語句和循環(huán)嵌套,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01