最近兩次寫筆記做業都很痛苦,由於感受重複課程內容和書上的東西實在是沒什麼意思,下週絕對換個作法。這周的筆記實在太少了,可是我實在是寫不下去了。函數
轉換函數spa
只要認爲是合理的,就能夠爲本身的類寫轉換函數,轉換成任意合理的類型(內置的或自定義的)。自定義的類型的定義須要在調用點可見。內部由本身設計。好比一個分數類,在使用中有可能被看成double,這時就能夠爲分數類寫一個從分數到double的轉換函數。我以爲這個轉換函數也能夠用重載的運算符替代。好比第一週的complex.設計
轉換函數在代理模式(proxy)中有應用。代理模式中用一種類型代替另外一種類型,這時每每須要寫一個從這兩種類型中的某一方轉換到另外一方的轉換函數。代理
explicitcode
class Fraction { public: Fraction(int num, int den = 1) :m_numerrator(num),m_denominator(den){} operator double() const { return (double)(m_numerrator / m_denominator); } private: int m_numerrator; int m_denominator; };
這段代碼中的構造函數是non-explict one-argument constructor, 在實際使用中能夠隱式地把一個double轉換爲分數(可是它並不算做轉換函數)。注意這段代碼中的構造函數和轉換函數在實際使用中會形成二義性調用,構造函數將double轉爲分數,轉換函數將分數轉爲double,這兩個函數並無誰比誰好,所以編譯器會不知道要調用哪個。要避免這種狀況,須要在構造函數前面加上explicit:blog
explicit Fraction(int num, int den = 1) :m_numerrator(num), m_denominator(den) {}
這樣這個函數就限制了從double到分數的隱式轉換。ci