关于C++强制类型转换函数和转换构造函数的问题

hailee1985 2014-10-31 10:53:15
class Complex
{
public:
Complex():real(0),imag(0){};
Complex(double r, double i):real(r),imag(i){};
Complex(double r):real(r),imag(0){}; // 定义转换构造函数

void Print(){
cout<<"real = " << real <<" image = "<<imag<<endl;
}
operator double(){ // 定义类型转换函数
return real;
}
private:
double real;
double imag;
};

int main(int argc, _TCHAR* argv[])
{
Complex c1(1.2, 2.3);
double d;
d = c1 + 1.1; //我不解的地方
cout<<d<<endl;

return 0;
}

这是网上一篇文章里的例子,文章里说,对于表达式语句“d = c1 + 1.1; ”,是先将c1利用强制类型转换函数转换成double类型,然后和1.1相加,最后赋值给d。

但我觉得,还有另外一条路径:先利用转换构造函数将1.1转换成一个临时的无名对象,再和c1执行“+”运算符计算(上面例子中没有给出“+”运算符计算,假设有哈!!!),然后将计算结果通过强制类型转换函数转换成d,好像通路也是可以的啊。那这两条通路,编译器到底会取哪条呢?因为不同的通路,很有可能结果完全不同的。
...全文
501 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailee1985 2016-12-07
  • 打赏
  • 举报
回复
还是没有想明白啊,C++好难哦
fefe82 2016-12-07
  • 打赏
  • 举报
回复
引用 6 楼 hailee1985 的回复:
还是没有想明白啊,C++好难哦
你的 Complex 不能做加法,所以转换成 Complex 的路径不成立。
xskxzr 2016-12-07
  • 打赏
  • 举报
回复
会报错。编译器不知道该怎么办。
mujiok2003 2014-11-01
  • 打赏
  • 举报
回复
Complex(double r):real(r),imag(0){};  // 定义转换构造函数  
加上explict
principl 2014-11-01
  • 打赏
  • 举报
回复
应该是第一条,你在类中没有定义 + 运算符的重载,第二条的解释不通吧。
zyc_0204 2014-10-31
  • 打赏
  • 举报
回复
有最佳匹配的。没有的话就有二异性。 至于哪个是最佳匹配,得去看书。
勤奋的小游侠 2014-10-31
  • 打赏
  • 举报
回复
你试一下不就知道了?你重载一个+操作看看啊
幻夢之葉 2014-10-31
  • 打赏
  • 举报
回复
如果你编译器编译通过,明显是使用第一条! 而且事实上也应该是第一条说法正确! 假设你的第二条正确: 1.1是个double类型值 它为什么能调用到你Complex 的()重载函数? 只有自己的对象才能调用自身类的非静态函数吧?所以对象在需要的时候查找转换为另一个类型的时候会知道可以调用()取得一个合法值 个人见解,如果有误请指出!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧