c++ explicit关键字_聊一聊 C++的特性 explicit 匿名空间
聊一聊 C++的特性 explicit && 匿名空間
explicit關(guān)鍵字
首先看一下explicit的作用:explicit 是避免構(gòu)造函數(shù)的參數(shù)自動(dòng)轉(zhuǎn)換為類(lèi)對(duì)象的標(biāo)識(shí)符,平時(shí)代碼中并不是經(jīng)常用到,但是,有時(shí)候就是因?yàn)檫@個(gè),會(huì)造成一定的BUG出現(xiàn),而我們卻苦苦查詢(xún)不到問(wèn)題;
下面看一個(gè)例子來(lái)說(shuō)明下:
案例一
test.cpp
#include?using?namespace?std;class?Test{public:????Test(int?a)????{????????_num?=?a;????}????int?getNum()????{????????return?_num;????}private:????int?_num;};int?main(){????Test?t?=?'c';????cout<我們看下結(jié)果:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o testroot@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test 99我們會(huì)發(fā)現(xiàn),程序在內(nèi)部就自動(dòng)幫我們進(jìn)行了轉(zhuǎn)換,假設(shè)我們本來(lái)是想得到是字符‘c’,但是被莫名的修改為了99,其實(shí)在一些程序中,我們沒(méi)有太關(guān)注這些自動(dòng)轉(zhuǎn)換的狀態(tài),但是我們閱讀一些開(kāi)源代碼庫(kù)的時(shí)候,很多都會(huì)避免這類(lèi)事情發(fā)生,而使用關(guān)鍵字explicit就是武器;
來(lái)看下構(gòu)造函數(shù)使用explicit的效果:
案例二
#include?using?namespace?std;class?Test{public:????explicit?Test(int?a)????{????????_num?=?a;????}????int?getNum()????{????????return?_num;????}private:????int?_num;};int?main(){????Test?t?=?'c';????cout<我們編譯一下:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o testtest.cpp: In function ‘int main()’:test.cpp:22:14: error: conversion from ‘char’ to non-scalar type ‘Test’ requested Test t = 'c';我們會(huì)發(fā)現(xiàn)使用explicit關(guān)鍵字,避免了上面異常自動(dòng)轉(zhuǎn)換的結(jié)果發(fā)生;
建議:我們編寫(xiě)C++類(lèi)的時(shí)候,如果能能把握住傳參的類(lèi)型問(wèn)題,可以忽略這個(gè)關(guān)鍵字,不過(guò)一般建議 加上,這樣,也可以增加代碼的健壯性;
匿名命名空間
對(duì)于命名空間,相信大家都還是蠻熟悉的,尤其是using namespace std這段,可謂是行云流水呀!這這個(gè)使用了std的命名空間;
拋磚引玉法:static
我們可以看一下static,回顧一下: 用于修飾 class 的數(shù)據(jù)成員,即所謂“靜態(tài)成員”。這種數(shù)據(jù)成員的生存期大于 class 的對(duì)象(實(shí)例/instance)。靜態(tài)數(shù)據(jù)成員是每個(gè) class 有一份,普通數(shù)據(jù)成員是每個(gè) instance 有一份,因此也分別叫做 class variable 和 instance variable。static類(lèi)成員不像普通的類(lèi)數(shù)據(jù)成員,static類(lèi)數(shù)據(jù)成員獨(dú)立于一切類(lèi)對(duì)象處在。static類(lèi)數(shù)據(jù)成員是與類(lèi)關(guān)聯(lián)的,但不與該類(lèi)定義的對(duì)象有任何關(guān)系。即static不會(huì)像普通類(lèi)數(shù)據(jù)成員一樣每一個(gè)類(lèi)對(duì)象都有一份,全部類(lèi)對(duì)象是共享一個(gè)static類(lèi)成員的。例如A類(lèi)對(duì)象修改了static成員為1,那么B對(duì)象對(duì)應(yīng)的static類(lèi)對(duì)象成員的值也會(huì)是1。
匿名的空間是C++用于替代使用static定義作用域?yàn)楸揪幾g單元的全局函數(shù)或全局變量的一種新的替代方式,匿名空間與命名的命名空間一樣可以嵌套。由于匿名命名空間沒(méi)有命名空間的名字,所以也無(wú)法在其它的編譯單元內(nèi)通過(guò)extern聲明該變量,于是該變量自然也只在本編譯單元內(nèi)可見(jiàn)
? ------來(lái)源互聯(lián)網(wǎng)
我們看一下例子;
案例三
#include?using?namespace?std;namespace?{????int?num?=?10;}namespace?test{????namespace?????{????????int?num?=?20;????}????void?Print()????{????????cout<結(jié)果:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt#?./test_________________________test::maintest:num:20num:10_________________________test::Printtest:num:20num:10相對(duì)于static來(lái)說(shuō),使用匿名空間的好處是: 1.對(duì)于一組多個(gè)標(biāo)識(shí)符函數(shù)只需要使用一個(gè)匿名空間來(lái)聲明,不需要多次輸入static。
2.可以嵌套。這樣可以在不同命名空間中使用多個(gè)同名的標(biāo)識(shí)符。
總結(jié)
以上是生活随笔為你收集整理的c++ explicit关键字_聊一聊 C++的特性 explicit 匿名空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: easyui获取下拉框选中的文本值_Wo
- 下一篇: ezcad旋转轴标刻参数_激光打标机软件