備註:
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)); }
...