1 转换
1.1 转换函数
将当前对象的类型转换成其他类型
- 以
operator
开头,函数名称为需要转成的类型,无参数 - 前面不需要写返回类型,编译器会自动根据函数名称进行补充
- 转换函数中,分子分母都没改变,所以通常加
const
// class Fraction里的一个成员函数
operator double() const
{
return (double) (m_numerator / m_denominator);
}
Fraction f(3,5);
double d = 4 + f; //编译器自动调用转换函数将f转换为0.6
1.2 non-explicit-one-argument ctor
将其他类型的对象转换为当前类型
one-argument 表示只要一个实参就够了
// non-explicit-one-argument ctor
Fraction(int num, int den = 1)
: m_numerator(num), m_denominator(den) {}
Fraction f(3,5);
Fraction d = f + 4; //编译器调用ctor将4转化为Fraction
1.3 explicit
当上面两个都有转换功能的函数在一起,编译器调用时都可以用,报错
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) const
{
return Fraction(...);
}
private:
int m_numerator; // 分子
int m_denominator; // 分母
};
...
Fraction f(3,5);
Fraction d = f + 4; // [Error] ambiguous
one-argument ctor 加上 explicit
,表示这个 ctor 只能在构造的时候使用,编译器不能拿来进行类型转换了
...
explicit Fraction(int num, int den = 1)
: m_numerator(num), m_denominator(den) {}
...
Fraction f(3,5);
Fraction d = f + 4; // [Error] 4不能从‘double’转化为‘Fraction’
关键字
explicit
主要就在这里运用