(1)用戶定義的轉(zhuǎn)換的必要性:我們希望能夠在SmallInt對(duì)象和其他SmallInt對(duì)象或者內(nèi)置算術(shù)類型的對(duì)象之間進(jìn)行加減操作,我們要通過(guò)提供6個(gè)SmallInt操作符函數(shù)來(lái)實(shí)現(xiàn)對(duì)這些操作的支持:
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;
};
兩個(gè)成員操作符允許我們加減兩個(gè)SmallInt對(duì)象。友元全局操作符允許我們?cè)赟mallInt對(duì)象和內(nèi)置算術(shù)類型的對(duì)象之間進(jìn)行加減操作。之所以只需要6個(gè)操作符,是因?yàn)槿魏蝺?nèi)置算術(shù)類型都可以被轉(zhuǎn)換為與int型參數(shù)相匹配。
如果我們還想支持按位操作符、邏輯操作符、關(guān)系操作符和復(fù)合賦值操作符,則要求的操作符的數(shù)目就變得非??膳铝?。我們更希望的,不是提供所有的重載操作符,而是一種將SmallInt類對(duì)象自動(dòng)轉(zhuǎn)換成int 型對(duì)象的方式。
C++提供了一種機(jī)制,通過(guò)它,每個(gè)類都可以定義一組“可被應(yīng)用在該類型對(duì)象上的轉(zhuǎn)換”。對(duì)于SmallInt,我們定義了一個(gè)從SmallInt對(duì)象到int型的轉(zhuǎn)換。
class SmallInt ...{
public:
SmallInt( int ival ) : value( ival ) ...{ }
// 轉(zhuǎn)換操作符
// SmallInt ==> int
operator int() ...{ return value; }
// 沒(méi)有提供重載操作符
private:
int value;
};
(2)需要注意的地方:
(a)轉(zhuǎn)換函數(shù)必須是成員函數(shù),它的聲明不能指定返回類型和參數(shù)表。
operator int( SmallInt & ); // 錯(cuò)誤: 不是成員
class SmallInt ...{
public:
int operator int(); // 錯(cuò)誤: 返回類型
operator int( int = 0 ); // 錯(cuò)誤參數(shù)表
// ...
};
(b)顯式的類型轉(zhuǎn)換會(huì)導(dǎo)致調(diào)用轉(zhuǎn)換函數(shù)。(須注意在必要的時(shí)候?qū)⑥D(zhuǎn)換類型設(shè)置為const,只允許對(duì)被轉(zhuǎn)換的類對(duì)象進(jìn)行只讀訪問(wè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)類型可以通過(guò)標(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 通過(guò)標(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)然,可通過(guò)在類的構(gòu)造函數(shù)前設(shè)置explicit,以禁止將其用來(lái)執(zhí)行隱式轉(zhuǎn)換。
來(lái)源:神秘0次