转换函数 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);
- 转换函数在 STL 中的实例
non-explicit-one-argument ctor
- Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) { }
- 一个实参(就够了)
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将 4 转换 Fraction(4,1)
然后调用operator+
- 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
- 基本只会在构造函数前面加这个关键字(模板中有一个也可以加这个关键字,但是很少人用)