operator 要转换的类型() const {return 转换后的值;}
因为转换函数是不需要对数据进行什么操作的,,只是把一个类型转换到另一个类型,没有数值上的改动,因此加上一个const。
//构造函数
Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//调用
Wsj w1(3, 4);
double tmp = 2.0 + w1;
//那么tmp是可以成功输出的,因为w1会被转换函数变成double类型,从而与2相加
//思考:上面式子改为w1 = 2.0 + w1;是否正确呢?
上述问题是正确的:因为w1会经过转换函数的转换从而变成double类型与2.0相加,产生了一个单值14.0;构造函数会自动把14.0作为double m_mo,第二个值参数为1,从而把14.0隐式转换成了Wsj对象类型,从而是正确写法。
//构造函数
Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//运算符重载
Wsj& operator +(const Wsj& ss){...}
//加上运算符重载这段代码会不会报错呢?
w1 = 2.0 + w1;
这段代码是无法正确运行的原因如下:
那怎么解决呢?得看关键字explicit
这个关键字是明确的意思,,绝大多数情况是放在构造函数前面让构造函数不要“自作多情”,即明确构造函数的功能,不让构造函数进行一些隐式转换;
//构造函数
explicit Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//运算符重载
Wsj& operator +(const Wsj& ss){...}
//调用
w1 = 2.0 + w1;
//这样的话,程序就能运行了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。