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