怎樣重載強制類型轉換操作符

我們知道C++支持對操作符的重載,但強制類型轉換的重在格式和普通的操作符重載有幾分不同。操作符的重載,在上一篇中,我們已經詳細的討論過,現在,我們就來看看如何重載一個強制類型轉換的操作符。
    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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章