- 基礎類型轉換
- 基礎類型轉爲類類型
- 類類型轉換爲基礎類型
//non-explicit-one-argument ctor
class Fraction
{
public:
//non-explicit-one-argument ctor
//one-argument:只要一個實參就夠了,給兩個也可以。two-parameter
//non-explicit:沒有添加explicit修飾
//可以把int隱式的轉換爲Fraction
Fraction(int num, int den = 1)//這種默認是符合數學上的規定
:m_numerator(num), m_denominator(den) {}
Fraction operator+(const Fraction& f) {
return Fraction(1,2);
}
private:
int m_numerator; //分子
int m_denominator; //分母
};
Fraction f(3, 5);
double d = f + 4;
//編譯器首先是去找operator+函數,找到了
//但是,此operator+()不匹配。
//然後看int是否可以轉換爲Fraction。
//調用non-explicit ctor將4轉爲Fraction f(4, 1)
//然後調用operator+
//explicit-one-argument ctor
class Fraction
{
public:
//關鍵字explicit
//明確制定ctor只能在直接初始化的時候可以調用
//不允許編譯器自動的進行類型轉換
explicit Fraction(int num, int den = 1)
:m_numerator(num), m_denominator(den) {}
//轉出去,把Fraction轉換爲double
operator double() const {
return (double)m_numerator / (double)m_denominator;
}
Fraction operator+(const Fraction& f) {
int fenzi = m_denominator*f.m_numerator + f.m_denominator*m_numerator;
int fenmu = m_denominator*f.m_denominator;
return Fraction(fenzi, fenmu);
}
private:
int m_numerator; //分子
int m_denominator; //分母
};
Fraction f(3, 5);
double d = f + 4;
//explicit關鍵字不允許編譯器從int到Fraction的轉換
//Fraction可以轉換到double,執行double+double
轉換函數使用的示例代碼如下:
//conversion function,轉換函數
class Fraction
{
public:
Fraction(int num, int den = 1)
:m_numerator(num), m_denominator(den) {}
//轉出去
//轉換函數,不一定是基本類型,只要有定義即可
//可以把這種東西(Fraction)轉換爲別的東西(double)
operator double() const {
return (double)m_numerator / (double)m_denominator;
}
private:
int m_numerator; //分子
int m_denominator; //分母
};
Fraction f(3, 5);
double d = 4 + f;
//編譯器首先是去找operator+()函數,沒找到
//然後去找轉換函數,找到了
//編譯器會調用operator double()將f轉爲double