C++【类】的【隐式转换】方向,该怎么解决
C++【类】的【隐式转换】方向
谭浩强那本C++看到 运算符重载 的最后一节
我们先看下
int a=3.5+2;
编译器是把2转化为double型 算出5.5后变回int型 再给a的
就是说整型转化为double型无精度损失(除去变double后加减乘除计算过程中的损失)
所以int转化为double是它的无警告、默认的隐式转换方向
而如果我定义了个类 实际上它的作用是存储复数 class Complex{……};
定义了Complex转化为double的强制转化方式 也定义了double到Complex的 还重载了+以适应复数运算
而书中说如果这两个都定义 那么
c1+3.5//Complex类型加double类型
编译器就无法判断是转化为哪一类型来计算
显然我们都知道当复数来运算不会有精度损失
那么如何告诉编译器这点呢 让它有如int与double关系一样的自动隐式转化方向?
------解决方案--------------------
你这种一般就是编译错误
如果非要支持转换,可以在operator double上加上explicit
不过这得要c++11才支持
------解决方案--------------------
重载operator+(double),在定义里将参数显式转型为Complex对象,再调用operator+(complex&)进行计算。
------解决方案--------------------
c++primer
c++程序设计语言
c++编程思想
等等做为编程的基础书都不错;
------解决方案--------------------
你如果重载+
1.作为类的成员函数(单个参数),则返回的一般使用Complex类型比较合适
2.非成员变量重载+运算符(两个参数),那个返回类型就随便你定了
(其中2点都可以使用模板,以及特化来适应重用和特殊的要求)
谭浩强那本C++看到 运算符重载 的最后一节
我们先看下
int a=3.5+2;
编译器是把2转化为double型 算出5.5后变回int型 再给a的
就是说整型转化为double型无精度损失(除去变double后加减乘除计算过程中的损失)
所以int转化为double是它的无警告、默认的隐式转换方向
而如果我定义了个类 实际上它的作用是存储复数 class Complex{……};
定义了Complex转化为double的强制转化方式 也定义了double到Complex的 还重载了+以适应复数运算
而书中说如果这两个都定义 那么
c1+3.5//Complex类型加double类型
编译器就无法判断是转化为哪一类型来计算
显然我们都知道当复数来运算不会有精度损失
那么如何告诉编译器这点呢 让它有如int与double关系一样的自动隐式转化方向?
------解决方案--------------------
你这种一般就是编译错误
如果非要支持转换,可以在operator double上加上explicit
不过这得要c++11才支持
------解决方案--------------------
重载operator+(double),在定义里将参数显式转型为Complex对象,再调用operator+(complex&)进行计算。
------解决方案--------------------
c++primer
c++程序设计语言
c++编程思想
等等做为编程的基础书都不错;
------解决方案--------------------
你如果重载+
1.作为类的成员函数(单个参数),则返回的一般使用Complex类型比较合适
2.非成员变量重载+运算符(两个参数),那个返回类型就随便你定了
(其中2点都可以使用模板,以及特化来适应重用和特殊的要求)