C++自制心得——開(kāi)篇(命名空間篇)
前言:?
本心得只適合給那些擁有C語(yǔ)言基礎(chǔ) (系統(tǒng)的自主學(xué)習(xí)過(guò)C語(yǔ)言(以找工作為目標(biāo),學(xué)校老師教的一律視作沒(méi)學(xué)),了解一些底層機(jī)制,用C實(shí)現(xiàn)過(guò)一些基本數(shù)據(jù)結(jié)構(gòu)?(順序表、鏈表、隊(duì)列與棧、初等二叉樹(shù)、十大經(jīng)典排序等) ) 的人觀看。如果你不滿足上述條件就不要在這里浪費(fèi)時(shí)間了。
本人在寫(xiě)專欄上的技術(shù)力并不好,如果你覺(jué)得這篇文章在排版上有需要改進(jìn)的地方可以在評(píng)論區(qū)留言并附上具體操作流程。
本人目前是大二在讀生,目前剛開(kāi)始學(xué)習(xí)C++相關(guān)知識(shí),如果有大佬發(fā)現(xiàn)哪里介紹的不對(duì)或者有疏漏歡迎在評(píng)論區(qū)留言,我盡量在發(fā)現(xiàn)的第一時(shí)間糾正。
好,廢話不多講,我們進(jìn)入正題。
眾所周知,C++是C的豪華升級(jí)版,它在C語(yǔ)言的基礎(chǔ)上填補(bǔ)了一系列漏洞,并增加了很多新機(jī)制,我們先介紹一些給C語(yǔ)言打的補(bǔ)丁。
正文
我們先給一段代碼

顯然,現(xiàn)在這段代碼可以正常使用,沒(méi)有問(wèn)題。but......看看下面這個(gè)。

請(qǐng)看劃紅線的地方,rand重定義,以前定義為函數(shù)。為什么?因?yàn)槲覀兌喟艘粋€(gè)名為stdlib.h的頭文件,其中定義了一個(gè)名為rand的函數(shù),而我們也定義了一個(gè)名為rand的int全局變量,名字重了。
我知道你想說(shuō)什么,正常人不會(huì)定義一個(gè)名為rand的變量,自然也不會(huì)出現(xiàn)這種低級(jí)錯(cuò)誤。但隨著你包含的官方庫(kù)文件和自定義庫(kù)文件數(shù)量的增加,出現(xiàn)這類問(wèn)題的幾率也會(huì)變大。更糟的是,C語(yǔ)言本身不提供此類問(wèn)題的解決方案。官方庫(kù)文件還可以避著走,你同事寫(xiě)的庫(kù)文件怎么辦,難不成和他在線下激情開(kāi)撕,誰(shuí)輸了誰(shuí)改名。嗯,看來(lái)程序員也要練Chinese kungfu,人人都要練成能手撕鬼子的超人ε=(′ο`*)))。
為了節(jié)省廣大程序員的醫(yī)藥費(fèi),C++加入了命名空間,快說(shuō)謝謝。


就像這樣,現(xiàn)在惱人的重定義問(wèn)題終于被解決了......至少是部分,因?yàn)檫€有一些小細(xì)節(jié)。不過(guò)在此之前我們先講講命名空間的基本用法。



可以看到,命名空間的基本用法還是很容易理解的,創(chuàng)建一個(gè)域,把代碼放進(jìn)去,用的時(shí)候只需在變量前+命名空間名和::就行。
(tips: 如果沒(méi)在二叉樹(shù)節(jié)點(diǎn)的定義用typedef偷雞,那main函數(shù)里的代碼應(yīng)該寫(xiě)成:? struct test:: BinaryNode Node)
命名空間的展開(kāi)
命名空間相當(dāng)于一個(gè)權(quán)限鎖,編譯器在沒(méi)有授權(quán)的情況下(無(wú)::修飾)只會(huì)去公共空間尋找定義,有了授權(quán)它就只會(huì)去命名空間尋找定義(找不到就報(bào)錯(cuò)),那有沒(méi)有一次性解鎖的方式?老是寫(xiě)::太煩了。命名空間的展開(kāi)可以幫助解決這個(gè)問(wèn)題。


這就是一個(gè)命名空間的全展開(kāi),很簡(jiǎn)單用一下using關(guān)鍵字就可以了。
惱人的重定義問(wèn)題終于被解決了......至少是部分
實(shí)際上命名空間的展開(kāi)是一種很危險(xiǎn)的行為,因?yàn)殚_(kāi)放權(quán)限后命名空間里的內(nèi)容就直接進(jìn)入公共空間了,如果此時(shí)你的公共空間里有重復(fù)定義,那重定義問(wèn)題就叕叒雙又來(lái)了。


那還有別的方法嗎?我就不想寫(xiě)六次::。那就試試半展開(kāi)。


完美,代碼看著舒服多了。(tips: 其實(shí)只用在rand的前面加上::就能解決問(wèn)題,沒(méi)必要半展開(kāi))?