class mydouble
{
public:
mydouble(double d)
{
m_data = d;
}
operator float() // 重載針對float的強制類型轉換
{
return (float)m_data;
}
operator int() // 重載針對int的強制類型轉換
{
return (int)m_data;
}
private:
double m_data;
};
這是一個非常簡單的例子,不過它已經足以描述我要說明的問題。假如,我們有如下的一個函數:
print(int n)
{
printf("%d\n", n);
}
當我們如下來使用mydouble的時候:
mydouble dbl(234.33);
print(dbl); // 注意此處正隱式調用了operator int()函數
我們所定義的int型強制類型轉換就會被調用。
我們看到,強制類型轉換的操作符重載,很不符合我們的習慣。通常,函數都是需要定義一個返回類型的,不過,對於強制類型轉換的操作符重載函數來說,因爲我們已經知道它所需要獲得的類型,從而就不再追加這樣的一個累贅,而是將函數名與返回類型合併,給出一個簡潔的形式。
強制類型轉換,在函數調用的時候經常會被用到,而用的最爲頻繁的,估計會是CString類中的LPCTSTR強制類型轉換。這個函數返回的是字符串的指針,從而可以使很多需要提供字符串的函數,可以直接傳入CString的對象,比如下面的例子:
char sz1vName[64] = {0};
CString str("Tian");
strcpy(sz1vName, str); // 其實,此時調用了強制類型轉換,將str轉換成一個const char*的指針
顯然,強制類型轉換所帶來的好處是不言而喻的,並且,實現它們也並不那麼困難,那麼我這裏有一個思考題:爲什麼printf函數可以向下面那樣使用呢?它使用了強制類型轉換了嗎?
printf("My name is %s\n", str);