原創(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.示例
先看一段代碼。
- #include "stdafx.h"
- using namespace std;
-
- class A
- {
- public:
- A(int v):var(v){};//帶一個(gè)int型值的構(gòu)造函數(shù)
- bool isSame(const A& ref) const {return var==ref.var;}//判等函數(shù)
- private:
- int var;//成員變量var
- };
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- A a(5);//構(gòu)造a對(duì)象
- A b(5);//構(gòu)造b對(duì)象
- if (a.isSame(b))
- cout<<"a==b"<<endl;
- else
- cout<<"a!=b"<<endl;
- }
代碼定義了類(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ù)為如下代碼。
- int _tmain(int argc, _TCHAR* argv[])
- {
- A a(5);//構(gòu)造a對(duì)象
- if (a.isSame(5))//這里會(huì)因?yàn)闃?gòu)造函數(shù)的隱式轉(zhuǎn)換,因而正確執(zhí)行isSame
- cout<<"a==b"<<endl;
- else
- cout<<"a!=b"<<endl;
- }
這看起來(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)題。
- class A
- {
- public:
- explicit A(int v):var(v){};//引入explicit關(guān)鍵字
- bool isSame(const A& ref) const {return var==ref.var;}
- private:
- int var;
- };
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- A a(5);
- if (a.isSame(5))
- cout<<"a==b"<<endl;
- else
- cout<<"a!=b"<<endl;
- }
看看結(jié)果:- error C2664: “A::isSame”: 不能將參數(shù) 1 從“int”轉(zhuǎn)換為“const A &”
- 1> 原因如下: 無(wú)法從“int”轉(zhuǎn)換為“const A”
- 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ù)吧。
- int _tmain(int argc, _TCHAR* argv[])
- {
- A a(5);
- if (a.isSame(A(5)))//顯式使用構(gòu)造函數(shù)
- cout<<"a==b"<<endl;
- else
- cout<<"a!=b"<<endl;
- }
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ú)法傳入。
|