- 反向编程和面向对象编程
- 继承关系中this指针、虚函数
一. 转换函数 conversion function
- 自动转换为double类型,并参与运算。
- 不需要写return type。返回类型与函数名称相同:double
class Fraction{
public:
Fraction(int num, int den=1)
:m_numerator(num), m_denominator(den)
operator double() const{
return (double)(m_numerator/m_denominator);
}
private:
int m_numerator; //分子
int m_denominator; //分母
};
Fraction f(3,5);
double d=4+f; //调用operator double() 将 f 转为 double
二. non-explicit-one-argument ctor
- 非显示一个实参构造函数
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-explicit ctor 转为Fraction(4, 1), 然后调用operator+
三. conversion function vs. non-explicit-one-argument ctor
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] 编译器可以使用两条路线,会冲突
四. explicit-one-argument ctor
- 加explict关键字,明确的使用构造函数的时候,再调用构造函数
class Fraction{
public:
explict 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'
五. 转换函数的例子
- 待补充,也是一种经典的设计模式。
template<class Alloc>
class vector<bool, Alloc>{
public:
typedef __bit_reference
}
网友评论