一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當(dāng)前位置: > 關(guān)注 > > 正文

今日熱搜:如何使用using聲明防止命名沖突?命令空間的using聲明

來源:CSDN 時(shí)間:2023-03-02 09:34:42

1、概述

我們用到的庫函數(shù)基本上都屬于命名空間std的,在程序使用的過程中要顯示的將這一點(diǎn)標(biāo)示出來,如std::cout。這個(gè)方法比較煩瑣,而我們都知道使用using聲明則更方便更安全。


(資料圖)

這個(gè)我們程序員肯定都知道了,今天突發(fā)奇想就想對(duì)using整理一下。

2、命令空間的using聲明

我們?cè)跁鴮懩K功能時(shí),為了防止命名沖突會(huì)對(duì)模塊取命名空間,這樣子在使用時(shí)就需要指定是哪個(gè)命名空間,使用using聲明,則后面使用就無須前綴了。例如:

using std::cin;//using聲明,當(dāng)我們使用cin時(shí),從命名空間std中獲取它int main(){int i;cin >> i;//正確:cin和std::cin含義相同cout << i;//錯(cuò)誤:沒有對(duì)應(yīng)的using聲明,必須使用完整的名字return 0;}

需要注意的是每個(gè)名字需要獨(dú)立的using聲明。例如:

using std::cin;//必須每一個(gè)都有獨(dú)立的using聲明using std::cout;  using std::endl;//寫在同一行也需要獨(dú)立聲明

位于頭文件的代碼一般來說不應(yīng)該使用using聲明。因?yàn)轭^文件的內(nèi)容會(huì)拷貝到所有引用它的文件中去,如果頭文件里有某個(gè)using聲明,那么每個(gè)使用了該頭文件的文件就都會(huì)有這個(gè)聲明,有可能產(chǎn)生名字沖突。

3、在子類中引用基類成員

在子類中對(duì)基類成員進(jìn)行聲明,可恢復(fù)基類的防控級(jí)別。有三點(diǎn)規(guī)則:

在基類中的private成員,不能在派生類中任何地方用using聲明。在基類中的protected成員,可以在派生類中任何地方用using聲明。當(dāng)在public下聲明時(shí),在類定義體外部,可以用派生類對(duì)象訪問該成員,但不能用基類對(duì)象訪問該成員;當(dāng)在protected下聲明時(shí),該成員可以被繼續(xù)派生下去;當(dāng)在private下聲明時(shí),對(duì)派生類定義體外部來說,該成員是派生類的私有成員。在基類中的public成員,可以在派生類中任何地方用using聲明。具體聲明后的效果同基類中的protected成員。

例如:

class Base {protected:    void test1() { cout << "test1" << endl; }    void test1(int a) {cout << "test2" << endl; }    int value = 55;}; class Derived : Base //使用默認(rèn)繼承{public:    //using Base::test1;//using只是聲明,不參與形參的指定    //using Base::value;    void test2() { cout << "value is " << value << endl; }};

我們知道class的默認(rèn)繼承是private,這樣子類中是無法訪問基類成員的,即test2會(huì)編譯出錯(cuò)。但是如果我們把上面注釋的聲明給放開,則沒有問題。

注意:using::test1只是聲明,不需要形參指定,所以test1的兩個(gè)重載版本在子類中都可使用。 但是在往下派生,則只能使用無參函數(shù),具體什么原因就不知道了…

4、使用using起別名

相當(dāng)于傳統(tǒng)的typedef起別名。

typedef std::vectorintvec;using intvec= std::vector;//這兩個(gè)寫法是等價(jià)的

這個(gè)還不是很明顯的優(yōu)勢(shì),在來看一個(gè)列子:

typedef void (*FP) (int, const std::string&);

若不是特別熟悉函數(shù)指針與typedef,第一眼還是很難指出FP其實(shí)是一個(gè)別名,代表著的是一個(gè)函數(shù)指針,而指向的這個(gè)函數(shù)返回類型是void,接受參數(shù)是int, const std::string&。

using FP = void (*) (int, const std::string&);

這樣就很明顯了,一看FP就是一個(gè)別名。using的寫法把別名的名字強(qiáng)制分離到了左邊,而把別名指向的放在了右邊,比較清晰,可讀性比較好。比如:

typedef std::string (* fooMemFnPtr) (const std::string&);    using fooMemFnPtr = std::string (*) (const std::string&);

來看一下模板別名。

templateusing Vec = MyVector; // usageVecvec;

若使用typedef

templatetypedef MyVectorVec; // usageVecvec;

當(dāng)進(jìn)行編譯的時(shí)候,編譯器會(huì)給出error: a typedef cannot be a template的錯(cuò)誤信息。

那么,如果我們想要用typedef做到這一點(diǎn),需要進(jìn)行包裝一層,如:

templatestruct Vec{  typedef MyVectortype;};// usageVec::type vec;

正如你所看到的,這樣是非常不漂亮的。而更糟糕的是,如果你想要把這樣的類型用在模板類或者進(jìn)行參數(shù)傳遞的時(shí)候,你需要使用typename強(qiáng)制指定這樣的成員為類型,而不是說這樣的::type是一個(gè)靜態(tài)成員亦或者其它情況可以滿足這樣的語法,如:

templateclass Widget{  typename Vec::type vec;};

然而,如果是使用using語法的模板別名,你則完全避免了因?yàn)?:type引起的問題,也就完全不需要typename來指定了。

templateclass Widget{  Vecvec;};

一切都會(huì)非常的自然,所以于此,模板起別名時(shí)推薦using,而非typedef。

感謝大家,我是假裝很努力的YoungYangD(小羊)。

責(zé)任編輯:

標(biāo)簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top 主站蜘蛛池模板: 山东| 固原市| 治县。| 绥中县| 浪卡子县| 光泽县| 革吉县| 永州市| 惠安县| 高清| 庄浪县| 灌南县| 泸溪县| 于田县| 新宾| 乌拉特后旗| 苗栗县| 高淳县| 图们市| 独山县| 昌江| 永城市| 富顺县| 新余市| 拉萨市| 修武县| 昂仁县| 江孜县| 宕昌县| 泗水县| 德格县| 赞皇县| 随州市| 化州市| 天峻县| 苏尼特左旗| 凉城县| 平山县| 马山县| 德清县| 九龙城区|