說實話,從來沒有感覺到這個keyword實用,直到今天。
explicit 的意思是明顯的 , 和它相相應(yīng)的一個詞是 implicit 意思是隱藏的。
我參考了 MSDN 和 《 c++ 標準程序庫》對這個keyword的描寫敘述,并參考了網(wǎng)絡(luò)上對這個keyword的解釋。現(xiàn)將它的用法和總結(jié)記錄例如以下:
首先這個keyword僅僅能用在 類構(gòu)造函數(shù) 。它的作用是不能進行隱式轉(zhuǎn)換。
class gxgExplicit ? // 沒有keyword explicit 的類
{
public :
?? int _size;
?? gxgExplicit( int size)
?? {
????? _size = size;
?? }
};
以下是調(diào)用
?? gxgExplicit gE1(24); ???? // 這樣是沒有問題的
?? gxgExplicit gE2 = 1; ???? // 這樣也是沒有問題的
?? gxgExplicit gE3; ???????? // 這樣是不行的,沒有默認構(gòu)造函數(shù)
?? gE1 = 2; ????????????? ?? // 這樣也是沒有問題的
?? gE2 = 3; ????????????? ?? // 這樣也是沒有問題的
?? gE2 = gE1; ?????????????? // 這樣也是沒有問題的
?
可是假如 gxgExplicit 改動為 Stack ,我們的 _size 代表的是堆棧的大小,那么調(diào)用的第二句就顯得不倫不類,并且easy讓人疑惑。這并非能夠讓代碼閱讀者明確和接受的形式,盡管它是合法的(編譯器能夠通過編譯)。這是由于編譯器默認情況下有隱式轉(zhuǎn)換的功能,你輸入 gE2 = 1 就編譯成同第一句同樣的結(jié)果。所以, explicit 就派上了用場。改動代碼為:
class gxgExplicit
{
public :
?? int _size;
?? explicit gxgExplicit( int size)
?? {
????? _size = size;
?? }
};
繼續(xù)上面的調(diào)用 :
?? gxgExplicit gE1(24); ???? // 這樣是沒有問題的
?? gxgExplicit gE2 = 1; ???? // 這樣是不行的,keyword取消了隱式轉(zhuǎn)換
?? gxgExplicit gE3; ???????? // 這樣是不行的,沒有默認構(gòu)造函數(shù)
?? gE1 = 2; ????????????? ?? // 這樣是不行的,keyword取消了隱式轉(zhuǎn)換
?? gE2 = 3; ????????????? ?? // 這樣是不行的,keyword取消了隱式轉(zhuǎn)換
?? gE2 = gE1; ?????????????? // 這樣是不行的,keyword取消了隱式轉(zhuǎn)換,除非類實現(xiàn)操作符“ = ”的重載。
這是編譯器( vs2005 )顯示: cannot convert from 'int' to 'gxgExplicit' 。
從這里也就看出這個keyword的作用是將編譯器隱式轉(zhuǎn)換的功能給屏蔽掉。
?
MSDN 上有一個注意點描寫敘述了以下的事實,當構(gòu)造函數(shù)參數(shù)超過兩個時自己主動取消隱式轉(zhuǎn)換。比如
class gxgExplicit
{
private :
?? int _size;
?? int _age;
public :
?? explicit gxgExplicit( int age, int size)
?? {
????? _age = age;
????? _size = size;
?? }
};
這是有沒有keyword效果是一樣的。那就是相當于有這個keyword。
可是第二種情況例外:當中僅僅有一個必須輸入的參數(shù),其余的為有默認值的參數(shù)。
class gxgExplicit
{
private :
?? int _size;
?? int _age;
public :
?? explicit gxgExplicit( int age, int size = 0)
?? {
????? _age = age;
????? _size = size;
?? }
};
class gxgExplicit
{
private :
?? int _size;
?? int _age;
int _hight;
public :
?? explicit gxgExplicit( int age, int size = 0)
?? {
????? _age = age;
????? _size = size;
????? _hight = hight;
?? }
};
?
這種情況下相當于一個參數(shù)的效果。
到如今為止。這個keyword就是這么用了。
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
