侯捷 C++ part2 兼谈对象模型笔记——1 转换
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
主要就在这里运用