(1)用戶定義的轉(zhuǎn)換的必要性:我們希望能夠在SmallInt對象和其他SmallInt對象或者內(nèi)置算術(shù)類型的對象之間進(jìn)行加減操作,我們要通過提供6個SmallInt操作符函數(shù)來實(shí)現(xiàn)對這些操作的支持:
class SmallInt ...{
friend operator+( const SmallInt &, int );
friend operator-( const SmallInt &, int );
friend operator-( int, const SmallInt & );
friend operator+( int, const SmallInt & );
public:
SmallInt( int ival ) : value( ival ) ...{ }
operator+( const SmallInt & );
operator- ( const SmallInt & );
// ...
private:
int value;
};
兩個成員操作符允許我們加減兩個SmallInt對象。友元全局操作符允許我們在SmallInt對象和內(nèi)置算術(shù)類型的對象之間進(jìn)行加減操作。之所以只需要6個操作符,是因?yàn)槿魏蝺?nèi)置算術(shù)類型都可以被轉(zhuǎn)換為與int型參數(shù)相匹配。
如果我們還想支持按位操作符、邏輯操作符、關(guān)系操作符和復(fù)合賦值操作符,則要求的操作符的數(shù)目就變得非常可怕了。我們更希望的,不是提供所有的重載操作符,而是一種將SmallInt類對象自動轉(zhuǎn)換成int 型對象的方式。
C++提供了一種機(jī)制,通過它,每個類都可以定義一組“可被應(yīng)用在該類型對象上的轉(zhuǎn)換”。對于SmallInt,我們定義了一個從SmallInt對象到int型的轉(zhuǎn)換。
class SmallInt ...{
public:
SmallInt( int ival ) : value( ival ) ...{ }
// 轉(zhuǎn)換操作符
// SmallInt ==> int
operator int() ...{ return value; }
// 沒有提供重載操作符
private:
int value;
};
(2)需要注意的地方:
(a)轉(zhuǎn)換函數(shù)必須是成員函數(shù),它的聲明不能指定返回類型和參數(shù)表。
operator int( SmallInt & ); // 錯誤: 不是成員
class SmallInt ...{
public:
int operator int(); // 錯誤: 返回類型
operator int( int = 0 ); // 錯誤參數(shù)表
// ...
};
(b)顯式的類型轉(zhuǎn)換會導(dǎo)致調(diào)用轉(zhuǎn)換函數(shù)。(須注意在必要的時候?qū)⑥D(zhuǎn)換類型設(shè)置為const,只允許對被轉(zhuǎn)換的類對象進(jìn)行只讀訪問)
#include "Token.h"
Token tok( "function", 78 );
// 函數(shù)型的表示法: 調(diào)用 Token::operator SmallInt()
SmallInt tokVal = SmallInt( tok );
// static_cast: 調(diào)用 Token::operator tName()
char *tokName = static_cast< char * >( tok );
(c)如果轉(zhuǎn)換的目標(biāo)(本例中的double)與轉(zhuǎn)換函數(shù)的類型(本例中的int類型)不完全匹配,但目標(biāo)類型可以通過標(biāo)準(zhǔn)轉(zhuǎn)換序列到達(dá),則仍可調(diào)用轉(zhuǎn)換函數(shù)。
extern void calc( double );
Token tok( "constant", 44 );
// 調(diào)用 tok.operator int() 嗎? 是的
// int --> double 通過標(biāo)準(zhǔn)轉(zhuǎn)換
calc( tok );
(d)使用構(gòu)造函數(shù)作為轉(zhuǎn)換函數(shù)。
extern void func( Number );
SmallInt si( 87 );
{
// 調(diào)用 Number( const SmallInt & )
func( si );
}
當(dāng)然,可通過在類的構(gòu)造函數(shù)前設(shè)置explicit,以禁止將其用來執(zhí)行隱式轉(zhuǎn)換。
來源:神秘0次