备注:
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)); }
...