转换函数和explicit
转换函数(类—>基本类型)
重载数据类型,如这下面的 double()
class Fraction
{
public:
Fraction(int num,int den=1):m_num(num),m_den(den){}
operator double() const {
return (double)m_num / m_den;
}
private:
int m_num;
int m_den;
};
int main()
{
Fraction f(2, 6);
double d = 4 + f;
cout << d << endl; //4.3333
return 0;
}
//编译器遇到4+f时会优先判断是否重载了+号,发现没有,又看f能否类型转换为double或者int,找到了转换为double的函数后实现转换函数
no-explicit(基本类型—>类)
需要一个one-argument-ctor
class Fraction
{
public:
Fraction(int num, int den = 1) :m_num(num), m_den(den) {}
Fraction operator +(const Fraction& f) {
return Fraction(this->m_num + f.m_num, this->m_den + f.m_den);
}
private:
int m_num;
int m_den;
};
int main()
{
Fraction f(2, 6);
Fraction ff = f+4;
return 0;
}
//编译器看到f+4后发现是对象加对象,并且重载了+号,于是隐式的将4调用构造函数创建了对象来完成
//explicit关键字可取消这种隐式转换
//与转换函数不能同时满足(加了explicit就可以)
例:
#include<iostream>
using namespace std;
class Fraction
{
public:
Fraction(int num,int dem=1) :numerator(num), denominator(dem){}
//explicit Fraction(int num,int dem=1) :numerator(num), denominator(dem){} 解决
operator double() const //转换函数
{
return (double)(numerator / denominator);
}
Fraction& operator+(const Fraction& f)
{
this->numerator += f.numerator; //随便写一下,仅用做验证
return *this;
}
private:
int numerator;
int denominator;
};
int main()
{
Fraction f = Fraction(3, 5) + 4; //报错,出现二义性
//Fraction f = Fraction(3, 5) + (Fraction)4; //解决
//Fraction ff = Fraction(Fraction(3, 5) + 4); //解决
return 0;
}