C++关于转换构造函数自动调用的问题

来源:互联网 发布:vscode golang 格式化 编辑:程序博客网 时间:2024/05/23 02:06

声明Complex类:

class Complex

{
public:
Complex(double);
friend Complex operator+(Complex &,Complex &);
private:
double real;
double image;

};

主函数:

int main()
{

Complex c1(1.2,3.4),c2;
c2=2+c2;

return 0;
}

提示错误信息为:

 error C2678: 二进制“+”: 没有找到接受“int”类型的左操作数的运算符(或没有可接受的转换),可能是“Complex operator +(Complex &,Complex &)” 尝试匹配参数列表“(int,Complex)”时生成失败。

当把重载函数 friend Complex operator+(Complex &,Complex &) 改为 friend Complex operator+(Complex ,Complex ) 时又可以编译通过。

Complex类有一个声明了这个构造函数 Complex(double r),在C++里面默认如果类存在一个形参的构造函数时,可以将一个形参构造临时的类对象
也就是你的 c2= c 1+ 2;这个式子之所以正确,因为用2构造了一个临时对象。但是如果你把变量声明称引用,问题就出来了。这个对象是临时生成的,根本就不存在,因此就不能实现隐式类型转换;也就不成立了。
出错信息也很明显,没有实现重载。



Complex(double);
friend Complex operator+(Complex,Complex);
operator double();

同时存在时, c2= c 1+ 2;编译报错,因为存在二义性。

Complex(double);
friend Complex operator+(Complex &,Complex &);
operator double();

同时存在时, c2= c 1+ 2;运行可以正常通过,程序把c1通过类型转换函数转换成double型,相加得到的double型再通过转换构造函数转换成Complex型,然后赋值给c2,当转换构造函数的参数为实部时,所得结果c2的虚部恒为0(初始化值).

0 0
原创粉丝点击