一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

【C++基礎(chǔ)之十七】抑制由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換

 it程序猿修養(yǎng) 2014-12-30

原創(chuàng)作品作者:偶爾e網(wǎng)事,轉(zhuǎn)載請(qǐng)標(biāo)明http://blog.csdn.net/jackystudio/article/details/17006543


有時(shí)候構(gòu)造函數(shù)的隱式轉(zhuǎn)換可以幫我們不少忙,但有時(shí)候它也會(huì)幫倒忙。所以我們應(yīng)該要控制它,而不是讓它無(wú)腦操作。


1.示例

先看一段代碼。

  1. #include "stdafx.h"  
  2. using namespace std;  
  3.   
  4. class A  
  5. {  
  6. public:  
  7.     A(int v):var(v){};//帶一個(gè)int型值的構(gòu)造函數(shù)  
  8.     bool isSame(const A& ref) const {return var==ref.var;}//判等函數(shù)  
  9. private:  
  10.     int var;//成員變量var  
  11. };  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15.     A a(5);//構(gòu)造a對(duì)象  
  16.     A b(5);//構(gòu)造b對(duì)象  
  17.     if (a.isSame(b))  
  18.         cout<<"a==b"<<endl;  
  19.     else  
  20.         cout<<"a!=b"<<endl;  
  21. }  

代碼定義了類(lèi)A,包含一個(gè)int型成員變量var,構(gòu)造函數(shù)需要傳入var的初始值,isSame函數(shù)用于判斷2個(gè)類(lèi)A的對(duì)象是否相等(通過(guò)判斷成員變量var值)。上述代碼獲得結(jié)果是a==b。如果A b(3),獲得的結(jié)果就是a!=b。


2.構(gòu)造函數(shù)定義引起的隱式轉(zhuǎn)換

由于構(gòu)造函數(shù)需要傳入一個(gè)int型初始值,因此可以認(rèn)為這是一個(gè)隱式轉(zhuǎn)換,把一個(gè)int型值轉(zhuǎn)換為一個(gè)A類(lèi)型的對(duì)象。所以如果修改main函數(shù)為如下代碼。

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     A a(5);//構(gòu)造a對(duì)象  
  4.     if (a.isSame(5))//這里會(huì)因?yàn)闃?gòu)造函數(shù)的隱式轉(zhuǎn)換,因而正確執(zhí)行isSame  
  5.         cout<<"a==b"<<endl;  
  6.     else  
  7.         cout<<"a!=b"<<endl;  
  8. }  
這看起來(lái)不錯(cuò),好像還省了不少力氣,但是這樣的使用依賴于用戶是否有相應(yīng)的需求,有時(shí)候它將成為一個(gè)bug。所以更好的辦法是抑制這種由構(gòu)造函數(shù)引起的隱式轉(zhuǎn)換。


3.抑制抑制由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換

在構(gòu)造函數(shù)中引入explicit可以幫我們解決這個(gè)問(wèn)題。

  1. class A  
  2. {  
  3. public:  
  4.     explicit A(int v):var(v){};//引入explicit關(guān)鍵字  
  5.     bool isSame(const A& ref) const {return var==ref.var;}  
  6. private:  
  7.     int var;  
  8. };  
  9.   
  10. int _tmain(int argc, _TCHAR* argv[])  
  11. {  
  12.     A a(5);  
  13.     if (a.isSame(5))  
  14.         cout<<"a==b"<<endl;  
  15.     else  
  16.         cout<<"a!=b"<<endl;  
  17. }  
看看結(jié)果:
  1. error C2664: “A::isSame”: 不能將參數(shù) 1 從“int”轉(zhuǎn)換為“const A &”  
  2. 1>        原因如下: 無(wú)法從“int”轉(zhuǎn)換為“const A”  
  3. 1>        class“A”的構(gòu)造函數(shù)聲明為“explicit”  
好了,這樣一來(lái)構(gòu)造函數(shù)就無(wú)法進(jìn)行隱式轉(zhuǎn)換,


4.為轉(zhuǎn)換進(jìn)行顯式使用構(gòu)造函數(shù)

這時(shí)候仍想進(jìn)行轉(zhuǎn)換的話,顯式使用構(gòu)造函數(shù)吧。

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     A a(5);  
  4.     if (a.isSame(A(5)))//顯式使用構(gòu)造函數(shù)  
  5.         cout<<"a==b"<<endl;  
  6.     else  
  7.         cout<<"a!=b"<<endl;  
  8. }  

5.總結(jié)

除非有明顯的理由想利用構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換,否則設(shè)置explicit可以避免一些錯(cuò)誤,當(dāng)需要進(jìn)行轉(zhuǎn)換的時(shí)候,由用戶顯式地調(diào)用構(gòu)造函數(shù)。當(dāng)然C++的臨時(shí)對(duì)象都是const,如果isSame函參不是const型,則隱式調(diào)用構(gòu)造函數(shù)時(shí)生成的臨時(shí)對(duì)象也無(wú)法傳入。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    特黄大片性高水多欧美一级| 中文字幕一区久久综合| 国产又黄又爽又粗视频在线| 国产原创激情一区二区三区| 亚洲精品一区三区三区| 亚洲超碰成人天堂涩涩| 91老熟妇嗷嗷叫太91| 日韩欧美综合中文字幕| 国产精品不卡高清在线观看| 99热在线精品视频观看| 亚洲国产性生活高潮免费视频| 欧美午夜一级特黄大片| 亚洲人妻av中文字幕| 丰满少妇被猛烈撞击在线视频| 免费观看在线午夜视频| 国产欧美日韩视频91| 一区二区三区18禁看| 亚洲国产日韩欧美三级| 国产日产欧美精品视频| 日韩精品综合福利在线观看| 欧美成人久久久免费播放| 在线日本不卡一区二区| 中文文精品字幕一区二区| 日韩av欧美中文字幕| 欧美成人欧美一级乱黄| 日韩精品视频香蕉视频| 日本加勒比在线观看不卡| 国产麻豆视频一二三区| 91亚洲熟女少妇在线观看| 成人欧美一区二区三区视频| 日韩特级黄片免费观看| 免费精品国产日韩热久久| 成人免费在线视频大香蕉| 日韩在线一区中文字幕| 国产91麻豆精品成人区| 亚洲一区二区三区国产| 欧美精品久久男人的天堂| 婷婷色国产精品视频一区| 欧美日韩中国性生活视频| 夫妻性生活真人动作视频| 国产日韩熟女中文字幕|