在C和C + +中,如果編譯器看到一個表達(dá)式或函數(shù)調(diào)用使用了一個不合適的類型,它經(jīng)常
會執(zhí)行一個自動類型轉(zhuǎn)換。在C + +中,可以通過定義自動類型轉(zhuǎn)換函數(shù)來為用戶定義類型達(dá)到
相同效果。這些函數(shù)有兩種類型:特殊類型的構(gòu)造函數(shù)和重載的運(yùn)算符。
11.6.1 構(gòu)造函數(shù)轉(zhuǎn)換
如果我們定義一個構(gòu)造函數(shù),這個構(gòu)造函數(shù)能把另一類型對象(或引用)作為它的單個參
數(shù),那么這個構(gòu)造函數(shù)允許編譯器執(zhí)行自動類型轉(zhuǎn)換。如下例:
class One{
public:
One(){}
};
class Two{
public:
Two(const One&){}
};
void f(Two t){
}
main(){
One one;
f(one); //Wants a Two, has a One
}
當(dāng)編譯器看到f( )以為對象o n e參數(shù)調(diào)用時,編譯器檢查f( )的聲明并注意到它需要一個t w o
對象作為參數(shù)。然后,編譯器檢查是否有從對象one 到t w o的方法。它發(fā)現(xiàn)了構(gòu)造函數(shù)
t w o : : t w o ( o n e ),t w o : : t w o ( o n e )被悄悄地調(diào)用,結(jié)果對象t w o被傳遞給f( )。
在這個情況里,自動類型轉(zhuǎn)換避免了定義兩個f( )重載版本的麻煩。然而,代價是隱藏了
構(gòu)造函數(shù)對t w o的調(diào)用,如果我們關(guān)心f( )的調(diào)用效率的話,那就不要使用這種方法。
• 阻止構(gòu)造函數(shù)轉(zhuǎn)換
有時通過構(gòu)造函數(shù)自動轉(zhuǎn)換類型可能出現(xiàn)問題。為了避開這個麻煩,可以通過在前面加關(guān)
鍵字explicit (只能用于構(gòu)造函數(shù))來修改構(gòu)造函數(shù)。上例類t w o的構(gòu)造函數(shù)作了修改,如下:
class One{
public:
One(){}
};
class Two{
public:
Two(const One&){}
};
void f(Two t){
}
main(){
One one;
//f(one); //no auto conversion allowed
f(Two(one)); //OK user perform conversion
}
通過使類t w o的構(gòu)造函數(shù)顯式化,編譯器被告知不能使用那個構(gòu)造函數(shù)(那個類中其他非
顯式化的構(gòu)造函數(shù)仍可以執(zhí)行自動類型轉(zhuǎn)換)執(zhí)行任何自動轉(zhuǎn)換。如果用戶想進(jìn)行轉(zhuǎn)換必須寫
出代碼。上面代碼f ( t w o ( O n e ) )創(chuàng)建一個從類型O n e到t w o的臨時對象,就像編譯器在前面版本中
做的那樣。
11.6.2 運(yùn)算符轉(zhuǎn)換
第二種自動類型轉(zhuǎn)換的方法是通過運(yùn)算符重載。我們可以創(chuàng)建一個成員函數(shù),這個函數(shù)通
過在關(guān)鍵字o p e r a t o r后跟隨想要轉(zhuǎn)換到的類型的方法,將當(dāng)前類型轉(zhuǎn)換為希望的類型。這種形
式的運(yùn)算符重載是獨(dú)特的,因為沒有指定一個返回類型——返回類型就是我們正在重載的運(yùn)算
符的名字。這兒有一個例子:
class Three{
int i;
public:
Three(int I = 0, int = 0) : i(I){}
};
class Four{
int x;
public:
Four(int X) : x(X){}
operator Three(){ return Three(x); }
};
void g(three){}
void main(){
Four four(1);
g(four);
g(1);
}
用構(gòu)造函數(shù)技術(shù),目的類執(zhí)行轉(zhuǎn)換。然而使用運(yùn)算符技術(shù),是源類執(zhí)行轉(zhuǎn)換。構(gòu)造函數(shù)技
術(shù)的價值是在創(chuàng)建一個新類時為現(xiàn)有系統(tǒng)增加了新的轉(zhuǎn)換途徑。然而,創(chuàng)建一個單一參數(shù)的構(gòu)
造函數(shù)總是定義一個自動類型轉(zhuǎn)換(即使它有不止一個參數(shù)也是一樣,因為其余的參數(shù)將被缺
省處理),這可能并不是我們所想要的。另外,使用構(gòu)造函數(shù)技術(shù)沒有辦法實現(xiàn)從用戶定義類
型向內(nèi)置類型轉(zhuǎn)換,這只有運(yùn)算符重載可能做到。
posted on 2009-03-06 19:07
李陽 閱讀(1222)
評論(0) 編輯 收藏 引用 所屬分類:
C++