溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++核心技術(shù)知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-11-26 14:58:13 來(lái)源:億速云 閱讀:176 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C++核心技術(shù)知識(shí)點(diǎn)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1. 命名空間namespace

使用過(guò)C++的朋友一定聽(tīng)說(shuō)過(guò)命名空間吧。是的,就是你經(jīng)??吹降膎amespace, 雖然大多數(shù)同學(xué)都會(huì)用namespace, 但是只有少部分非常清楚namespace的作用。

下面,我就來(lái)簡(jiǎn)單總結(jié)一下吧。命名空間是1995年引入標(biāo)準(zhǔn)C++(ANSIC++)中的, 那么為什么要引入這么一個(gè)概念呢?

先講個(gè)故事: 同一個(gè)班級(jí)中有兩個(gè)相同名字的同學(xué),比如都叫A, 那么如果老師喊A的時(shí)候,就會(huì)導(dǎo)致沖突,不知道是哪個(gè)A應(yīng)該答應(yīng)。這個(gè)時(shí)候老師為了把這兩個(gè)同學(xué)區(qū)分開(kāi),就會(huì)重新給他們?nèi)€(gè)名字,分別叫BA和CA, 來(lái)避免名字沖突的問(wèn)題,其實(shí)在C++也是如此。

命名空間最重要的作用就是避免程序中的命名沖突問(wèn)題。

我們?cè)诮o代碼中的類或?qū)ο笕∶謺r(shí),很可能會(huì)遇到同名的情況,有的朋友可能覺(jué)得自己的代碼自己很熟悉,怎么可能同名?

是的,如果這個(gè)工程的作者只有你自己的話,同名的可能性確實(shí)比較小,但是在工作中我們接觸到的項(xiàng)目往往非常龐大,項(xiàng)目組成員可能涉及十幾人,幾十人甚至上百人不等(某些開(kāi)源項(xiàng)目,作者可能上千人),在這種情況下很難保證代碼中命名不沖突。

還有一種命名沖突的情況是兩個(gè)獨(dú)立的模塊,但是有相同功能的函數(shù),或變量,當(dāng)我們的項(xiàng)目同時(shí)引用這兩個(gè)模塊同名對(duì)象時(shí),編譯器便不知道該用哪一個(gè)模塊里面的對(duì)象了。

因此,引入命名空間的概念是非常合理且必要的事情。

形象點(diǎn)兒講,namespace就像工程中的柵欄,把相關(guān)的代碼(類,對(duì)象,函數(shù),變量...)圈起來(lái),這些namesapce 圈圈就相互獨(dú)立,互不影響,各玩各的。畫風(fēng)就像下面:

C++核心技術(shù)知識(shí)點(diǎn)有哪些

說(shuō)了這么多,那么namespace該怎么用呢?請(qǐng)看下面:

#include<iostream>using namespace std;int main(){    cout << "Hello World!" << endl;}

這里,我們還是以通俗易懂、簡(jiǎn)單友好的的Hello World為例。std就是C++標(biāo)準(zhǔn)命名空間。如果你不想帶上它,那么cout標(biāo)準(zhǔn)輸出就用不了,因?yàn)樗麄儽绘i進(jìn)了std這個(gè)圈里了,在其他地方是沒(méi)有辦法訪問(wèn)的。

如果非要用,那么代碼的畫風(fēng)就變成下面這樣的了,使用一個(gè)范圍操作符 "::", 表示要使用std中的cout進(jìn)行輸出

#include<iostream>int main(){    std::cout << "Hello World!" << std::endl;}

看到了嗎,cout要想出std這個(gè)圈,就必須帶上std這個(gè)鑰匙,對(duì)于其他模塊同樣的道理。在日常項(xiàng)目中,我們還常常會(huì)用到boost庫(kù),那么代碼中就需要boost這把鑰匙:

using namespace boost;

或者

boost::xx

命名空間相當(dāng)于圈定一個(gè)作用域,如果希望在某個(gè)作用域中使用另一個(gè)作用域的對(duì)象,便要使用using導(dǎo)入該對(duì)象所在命名空間,或者在這個(gè)對(duì)象前面加上該命名空間的名稱。

這樣看來(lái)似乎非常簡(jiǎn)單,確實(shí),簡(jiǎn)單在代碼中加上命名空間就好了,如果真是如此,我也沒(méi)有比較寫這個(gè)話題了,但是細(xì)看的話,還是能發(fā)現(xiàn)一些坑和一些小技巧的。

(1)using雖好,不要用在頭文件中

最近在看同事寫的代碼時(shí)發(fā)現(xiàn)有幾處在頭文件中使用using的情況,雖然在代碼前面簡(jiǎn)單粗暴地用using一下子導(dǎo)入整個(gè)命名空間,快速解決問(wèn)題。

但是,我們?cè)陂_(kāi)發(fā)的時(shí)候一個(gè)頭文件可能被很多個(gè)模塊引用(我們的頭文件供其他的人使用,我們很難確定別人會(huì)用在哪些地方),如果頭文件中直接用using,很容易引起命名沖突的問(wèn)題,所以為了降低debug的痛苦,建議不要在頭文件中使用using!

(2)避免大范圍使用using

 這個(gè)還是為了降低命名沖突的風(fēng)險(xiǎn)。

如果我們只是想用某個(gè)命名空間的某個(gè)對(duì)象時(shí),在用using引入命名空間時(shí),最好具體到這個(gè)對(duì)象所在的最小范圍命名空間。比如我要使用string,cin, cout,就可以這樣寫:

using std::string;using std::cin;using std::cout;

這里string就是std的子命名空間,大大縮小了命名空間范圍。

當(dāng)然,大多數(shù)情況下我們會(huì)在代碼中直接使用這樣的形式(命名空間名加上范圍操作符加上):

void func(){    std::cin ...;    std::string...;    std::cout...;}

上面說(shuō)了那么多都是在講怎么導(dǎo)入別人的命名空間,下面說(shuō)一下怎么定義我們自己的命名空間。

其實(shí)也很簡(jiǎn)單,就是去掉using,如下:

namespace 命名空間名{    表達(dá)式1;    ...    ...    表達(dá)式2;}

當(dāng)然,我們也可以對(duì)命名空間進(jìn)行嵌套操作:

namespace 命名空間名1{    ...    namespace 命名空間名2{    ...    }}

那么,命名空間名是唯一的嗎?或者說(shuō)必須要有命名空間名,答案是:否

namespace 命名空間名3 = 命名空間名1; //命名空間1等價(jià)于命名空間3//匿名命名空間namespace{    ......}

上面命名空間3等價(jià)于命名空間1相當(dāng)于給命名空間1取了一個(gè)別名,因?yàn)橛械臅r(shí)候我們會(huì)遇到比較冗長(zhǎng)的命名空間名,為了避免 繁瑣,可以用一個(gè)簡(jiǎn)短的名字替代。

除此之外,上面還有個(gè)匿名命名空間的例子,那么這個(gè)有什么用呢?

像上面,匿名命名空間形如:

namespace{    const int k = 10;}

雖然名為匿名,但是編譯器在編譯這部分代碼時(shí),會(huì)為它生成一個(gè)唯一的名字,而且還附加一條using指令,效果如下面的代碼所示:

namespace __UNIQUE_NAME_{    const int k = 10;}using namespace __UNIQUE_NAME_;

雖然編譯器能給匿名命名空間生成一個(gè)特殊的名字,但是這個(gè)命名空間對(duì)全局是不可見(jiàn)的,只在當(dāng)前文件中有用,而有名字的命名空間對(duì)全局是可見(jiàn)的,全局有效。

這個(gè)特點(diǎn)有點(diǎn)像static關(guān)鍵字,被static加持的全局變量,也只能在當(dāng)前文件中有效。實(shí)際上匿名命名空間就是C++用來(lái)替代static的,C++新標(biāo)準(zhǔn)推薦使用匿名空間而不推薦static。

“C++核心技術(shù)知識(shí)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI