摘要:據(jù)我了解,很多學(xué)校在學(xué)習(xí)的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是那么你真的了解它嗎命名空間是一個(gè)命名空間。如果我們真的想使用的話,的命名空間遍給了我們解決方法使用命名空間。
據(jù)我了解,很多學(xué)校在學(xué)習(xí)c++的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是
using?namespace?std;
那么你真的了解它嗎?
(1)命名空間
namespace是一個(gè)命名空間。在講述命名空間之前先了解為什么c++之父要?jiǎng)?chuàng)造這個(gè)功能。
在一個(gè)巨大的項(xiàng)目面前,很難保證每一個(gè)的協(xié)調(diào)一致,如果張三用了某一個(gè)變量,李四又不知道張三用了這個(gè)變量,那么這會(huì)導(dǎo)致命名重復(fù)。為了解決這個(gè)問題,就有了命名空間這個(gè)概念。
再講一句,我們有一些函數(shù),比如printf函數(shù),這些函數(shù)是編寫出來的,只是編寫者取了這個(gè)printf當(dāng)做函數(shù)的名字而已,所以我們定義變量的時(shí)候才不能使用printf等會(huì)產(chǎn)生爭議的名字。
如果我們真的想使用的話,c++的命名空間遍給了我們解決方法----使用命名空間。
#include#includeint main(){ int printf=1; printf("%d",printf);//這里我們暫時(shí)使用printf進(jìn)行演示,所以引上頭文件stdio.h}
首先毫無疑問,這個(gè)是不可能的
如果有的老鐵就是想用printf的話,我們此時(shí)就可以使用命名空間了。
首先:命名空間是全局的,必須寫在main函數(shù)外面
#include#includenamespace lxy{ int printf=1;}int main(){ printf("%d",lxy::printf); return 0;}
這樣的話是可以把1打印出來的,接下來詳細(xì)講一下:
這個(gè)lxy的位置是我自己命名的,代表這個(gè)是我自己的命名空間,當(dāng)然這里你可以任意的命名。
這個(gè)namespace是一個(gè)域,跟結(jié)構(gòu)體不一樣,結(jié)構(gòu)體那個(gè)是聲明,這個(gè)域就像是隱身衣一樣,讓系統(tǒng)編譯的時(shí)候不會(huì)去這個(gè)區(qū)里面讀取,所以這個(gè)時(shí)候系統(tǒng)不會(huì)認(rèn)為出現(xiàn)了兩個(gè)printf,從而不會(huì)引發(fā)問題,但是當(dāng)我們使用的時(shí)候我們可以寫上lxy::也就是命名空間的名字加個(gè)域作用限定符讓系統(tǒng)到命名空間查找這個(gè)變量。
這里要注意的是:命名空間是全局的,必須寫在main外面,且這個(gè)東西僅僅就是加了一個(gè)外殼,這個(gè)外殼的作用是讓編譯器編譯的時(shí)候不在這個(gè)空間里面作文章。所以里面該怎么寫就怎么寫,比如可以寫結(jié)構(gòu)體,可以寫函數(shù)等等。相當(dāng)于是你在main外面寫了一些東西,但是加上namespace加個(gè)隱身而已。
但是外面要牢記,這個(gè)東西是一個(gè)隱身衣,就可以應(yīng)對各種情況,在lxy::之前這個(gè)隱身衣一直在隱身。
下面列舉一些例子:
#include#includenamespace lxy { int printf;}int main(){ printf = 1;//錯(cuò),系統(tǒng)會(huì)認(rèn)為你對這個(gè)函數(shù)賦值了,沒有任何意義,直接報(bào)錯(cuò) lxy::printf = 1;//對,你專門用了printf這個(gè)(全局)變量,我們說過了int printf寫在main外面,是全局的 //只是加上了隱身buff而已。 printf("%d", lxy::printf); return 0;}
函數(shù)也一樣的:
#include#includenamespace lxy { int printf; int Add(int a, int b) { return a + b; }}int main(){ printf("%d", lxy::Add(5,6)); return 0;}
但是如果我把函數(shù)實(shí)現(xiàn)寫在外面,里面寫函數(shù)聲明呢?因?yàn)殡[身衣的緣故,相當(dāng)于你沒有寫函數(shù)聲明,如果你的函數(shù)定義寫在main上面的話,這樣也可以。(同一個(gè)cpp文件)
#include#includenamespace lxy { int printf; int Add(int a, int b);}int Add(int a, int b){ return a + b;}int main(){ printf("%d", /*lxy::*/Add(5,6)); return 0;}
請注意,這個(gè)時(shí)候你不可以寫lxy::了,因?yàn)槿绻氵@么寫的話系統(tǒng)會(huì)優(yōu)先的馬上去lxy的命名空間查找,發(fā)現(xiàn)只有函數(shù)定義哦,所以肯定是打印不出來的。
把本代碼函數(shù)定義移到其他cpp文件或者main下面的話,也是無法打印的。
我們等會(huì)講完之后會(huì)專門把結(jié)構(gòu)體提出來講。
注意:1.namespace可以嵌套
2.可以在不同的地方使用多次,比如不同的cpp文件中。其中命名空間名字一樣的空間會(huì)被編譯器整合在一起,所以你可以在一個(gè)源文件里面寫函數(shù)聲明,另一個(gè)里面寫函數(shù)定義。這是沒問題的。
?(2)命名空間的使用
1.嵌套命名空間的使用(我這里可以使用rand這個(gè)函數(shù)名作為變量因?yàn)槲译[身了)
#include#includenamespace lxy { namespace yzza { int rand; }}using namespace std;int main(){ lxy::yzza::rand = 5; cout << lxy::yzza::rand << endl; return 0;}
2.如果你不想寫lxy::這樣復(fù)雜的東西可以解除隱身,但是這個(gè)時(shí)候你已經(jīng)解除了哦,相當(dāng)于沒有隱身了。
#include#includenamespace lxy { namespace yzza { int rand1; } int a=10;}using namespace std;using namespace lxy::yzza;//這樣代表解除的是yzza,此時(shí)相當(dāng)于變量a沒有解除的,要解除a你還要寫//using namespace lxy;int main(){ rand1 = 5; cout << rand1 <
這樣解放的是整個(gè)命名空間,你也可以只解放一個(gè)變量
#include#includenamespace lxy { namespace yzza { int rand1; } int a=10;}using namespace std;using lxy::yzza::rand1;//解放rand1using lxy::a;//解放aint main(){ rand1 = 5; cout << rand1 <
。
那么回到標(biāo)題的問題,你們知道為什么要加上這句話了嗎?
因?yàn)閏++的函數(shù)名全部定義在std這個(gè)命名空間里面。如果不加這句話你加上std::也是一樣可以使用庫函數(shù)的。不過你就不能定義跟函數(shù)重名的變量了。
關(guān)于結(jié)構(gòu)體提一句。
#include#includenamespace lxy { struct yzza { int a; }N1;}//using lxy::N1;int main(){ lxy::N1.a = 5; printf("%d", lxy::N1.a); return 0;}
這里是結(jié)構(gòu)體變量名直接定義了的,直接按照上面的寫。
#include#includenamespace lxy { struct yzza { int a; }N1;}using lxy::yzza;int main(){ N1.a = 5; printf("%d", N1.a); return 0;}
此時(shí)寫lxy::yzza是直接錯(cuò)誤的,編譯器直接報(bào)錯(cuò)
#include#includenamespace lxy { struct yzza { int a; };}using lxy::yzza;int main(){ struct yzza N1; N1.a = 5; printf("%d", N1.a); return 0;}
直接寫lxy::yzza。
#include#includenamespace lxy { struct yzza { int a; };}//using lxy::yzza;int main(){ struct lxy::yzza N1;//注意::的位置,我們找的是yzza,不能寫 //struct yzza lxy::N1 N1.a = 5;//此時(shí)這里什么都不用寫了,因?yàn)槲业慕Y(jié)構(gòu)體變量已經(jīng)定義完成了 printf("%d", N1.a); return 0;}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125078.html
摘要:是多線程之間通信最重要的個(gè)方法,今天,棧長給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。實(shí)戰(zhàn)微信公眾號技術(shù)棧技術(shù)棧上面的例子結(jié)合來演示了它們的相互作用。更多多線程技術(shù)文章請?jiān)诩夹g(shù)棧微信公眾號后臺(tái)回復(fù)關(guān)鍵字多線程。 wait, notify, notifyAll 是多線程之間通信最重要的 3 個(gè)方法,今天,棧長給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。 定義 wait:讓持有該對象鎖的線程等待;...
摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫,Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位...
摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫,Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位...
閱讀 1234·2021-11-25 09:43
閱讀 1987·2021-11-11 10:58
閱讀 1210·2021-11-08 13:18
閱讀 2710·2019-08-29 16:25
閱讀 3526·2019-08-29 12:51
閱讀 3322·2019-08-29 12:30
閱讀 766·2019-08-26 13:24
閱讀 3699·2019-08-26 10:38