[008]CC++系列 | 转换函数(二)conversion function VS non-explicit-one-argument ctor

    技术2022-07-16  68

    备注:

    one-argument:Fraction(int num, int den=1)一个参数 

    class Fraction { public: Fraction(int num, int den=1) : m_numerator(num), m_denominator(den) {} Fraction operator+(const Fraction& f) { return Fraction(...); } private: int m_numerator; // 分子 int m_denominator; // 分母 }; Fraction f(3,5); Fraction d2 = f + 4; // 调用non-explict ctor将4转为Fraction(4,1),然后调用operator+

    一、VS conversion function

    class Fraction { public: Fraction(int num, int den=1) : m_numerator(num), m_denominator(den) {} operator double() const { return (double)( m_numerator / m_denominator ); } Fraction operator+(const Fraction& f) { return Fraction(...); } private: int m_numerator; // 分子 int m_denominator; // 分母 }; Fraction f(3,5); Fraction d2 = f + 4; // [Error]ambiguous

     

    二、explicit

    class Fraction { public: explicit Fraction(int num, int den=1) : m_numerator(num), m_denominator(den) {} operator double() const { return (double)( m_numerator / m_denominator ); } Fraction operator+(const Fraction& f) { return Fraction(...); } private: int m_numerator; // 分子 int m_denominator; // 分母 }; Fraction f(3,5); Fraction d2=f+4; // [Error]conversion from 'double' to 'Fraction' requested

    备注:

    不允许4转换成为Fraction!!!

     

    三、标准库例子 

    template<class Alloc> class vector<bool, Alloc> { public: typedef __bit_reference reference; protected: reference operator[](size_type n) { return *(begin() + difference_type(n)); ... struct __bit_reference { unsigned int* p; unsigned int mask; ... public: operator bool() const { return !(!(*p & mask)); } ...

     

    Processed: 0.010, SQL: 9