1、conversion function(转换函数)
条件: 有一个基本类型转换函数
用途:把对象转成基本数据类型
例子:
class Fraction
{
public:
explicit Fraction(int num, int den=1)
: m_numerator(num), m_denominator(den)
{ cout << m_numerator << ' ' << m_denominator << endl; }
operator double() const { //转换函数
return (double)m_numerator / m_denominator;
}
/*
Fraction operator+(const Fraction& f){
cout << "operator+(): " << f.m_numerator << ' ' << f.m_denominator << endl; //... plus return f; }
*/
private:
int m_numerator; //分子
int m_denominator; //分母
};
void test_conversion_functions()
{
cout << "test_conversion_functions()" << endl;
Fraction f(3,5);double d = 4 + f; //4.6,编译器查找有没有‘+’重载符,没有则查找有没有转化函数,找到double();
cout << d << endl;//! Fraction d2 = f + 4; //ambiguous
}
2、non-explicit-one-argument ctor
条件: 单参构造函数(只有一个参数没有默认值)前没有加explicit
用途:把基本数据类型转成对象
例子:
class Fraction
{
public:
explicit Fraction(int num, int den=1)
: m_numerator(num), m_denominator(den)
{ cout << m_numerator << ' ' << m_denominator << endl; }
Fraction operator+(const Fraction& f) {
cout << "operator+(): " << f.m_numerator << ' ' << f.m_denominator << endl;
//... plus
return f;
}
/*
Fraction(double d)
: m_numerator(d * 1000), m_denominator(1000)
{ cout << m_numerator << ' ' << m_denominator << endl; }
*/
private:
int m_numerator; //分子
int m_denominator; //分母
};
void test_conversion_functions()
{
cout << "test_conversion_functions()" << endl;
Fraction f(3,5);
Fraction d2 = f + 4; //调用non-explicit ctor,将4转为Fraction(4)
//然后再调用operator+
}
3、转换函数在标准库的应用
class vector中的operator [ ];