转换函数 conversion function
- 通常都会是const
- 不一定是基本类型,可以是string等
- 例子:分数 转换成 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; - // 编译器方法1:先找全局函数+,第一个参数是整数或者浮点数,第二个参数是Fraction → ng
// 编译器方法2:找Fraction转换成double的方法 → ok
- Fraction f(3,5);
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】模糊:会产生编译冲突
- Fraction f(3,5);
explicit-one-argument ctor
告诉编译器不要自动帮我做事情,等我真的调用构造函数的时候你再调用
explicit Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) { }
这样上面的 4 不会自动变成Fraction
基本只会在构造函数前面加这个关键字(模板中有一个也可以加这个关键字,但是很少人用)
本文深入探讨了分数类的设计,包括构造函数、运算符重载及转换函数的使用。重点讲解了如何将分数对象转换为double类型,以及在运算过程中如何避免编译错误。
151

被折叠的 条评论
为什么被折叠?



