C++语言问题
//t3_1#include<iostream>usingnamespacestd;classComplex{public:Complex(doubler=0,doubl...
//t3_1
#include<iostream>
using namespace std;
class Complex{
public:
Complex(double r=0,double i=0):rel(r),img(i){};
Complex(double f):rel(f),img(0){};
void display();
friend Complex operator+(Complex&,Complex&);//两复数相加
private:
double rel,img;
};
Complex operator+(Complex& c1,Complex& c2)/*const*/ //不能加,因为不是成员函数
{
return Complex(c1.rel+c2.rel,c1.img+c2.img);
}
int main(int argc,int* argv[])
{ Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
c3.display();
c3=c1+0.5;//0.5是double型
c3.display();
c3=0.5+c2;
c3.display();
system("pause");
return 0;
}
void Complex::display()
{ cout<<rel;
if(img>0) cout<<'+';
else if(img==0) return;
cout<<img<<'j'<<endl;
}
编译出错,提示
25: error: no match for 'operator+' in 'c1 + 5.0e-1'
16: note: candidates are: Complex operator+(Complex&, Complex&)
27: error: no match for 'operator+' in '5.0e-1 + c2'
16: note: candidates are: Complex operator+(Complex&, Complex&)
请高手指点!谢谢。
我想利用转换构造函数完成复数加法重载。 展开
#include<iostream>
using namespace std;
class Complex{
public:
Complex(double r=0,double i=0):rel(r),img(i){};
Complex(double f):rel(f),img(0){};
void display();
friend Complex operator+(Complex&,Complex&);//两复数相加
private:
double rel,img;
};
Complex operator+(Complex& c1,Complex& c2)/*const*/ //不能加,因为不是成员函数
{
return Complex(c1.rel+c2.rel,c1.img+c2.img);
}
int main(int argc,int* argv[])
{ Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
c3.display();
c3=c1+0.5;//0.5是double型
c3.display();
c3=0.5+c2;
c3.display();
system("pause");
return 0;
}
void Complex::display()
{ cout<<rel;
if(img>0) cout<<'+';
else if(img==0) return;
cout<<img<<'j'<<endl;
}
编译出错,提示
25: error: no match for 'operator+' in 'c1 + 5.0e-1'
16: note: candidates are: Complex operator+(Complex&, Complex&)
27: error: no match for 'operator+' in '5.0e-1 + c2'
16: note: candidates are: Complex operator+(Complex&, Complex&)
请高手指点!谢谢。
我想利用转换构造函数完成复数加法重载。 展开
展开全部
1、构造函数构建的临时对象不能转化成非const引用,所以类型不匹配。
把operator+的两个参数都加上const。
2、你的构造函数有歧义,解决了第一条后还会出现错误,用0.5构造一个复数时出现歧义,以为2个参数的构造函数的参数都有默认值,编译器不能确定到底用哪个。
第二个构造函数是多余的,注释掉。
这两条改过后我自己运行了下没问题了。
把operator+的两个参数都加上const。
2、你的构造函数有歧义,解决了第一条后还会出现错误,用0.5构造一个复数时出现歧义,以为2个参数的构造函数的参数都有默认值,编译器不能确定到底用哪个。
第二个构造函数是多余的,注释掉。
这两条改过后我自己运行了下没问题了。
追问
第2个构造函数不多余啊?还有“构造函数构建的临时对象不能转化成非const引用”,要是构造的对象有名字还是不是不能转化为非const引用?
追答
有的话就可以(前提是这个有名字的对象是非const)。
那两个函数:
Complex(double r=0,double i=0):rel(r),img(i){};
Complex(double f):rel(f),img(0){};
如果我写Complex a(3.0);那么编译器是用第一个还是第二个函数……
第二个函数看起来是完全匹配,所以貌似要用第二个,可是,第一个函数两个参数都有默认值,也就是编译器面临Complex(3.0,0.0)和Complex(3.0)这两个函数的选择,没有某个因素表明谁更好,所以出现歧义。
实际上,第一个函数就是个 默认 构造函数,可以试着定义第三个构造函数:
Complex():rel(0),img(0){}; 这个仍然会导致歧义,原因还在于那两个带默认值的形参。
展开全部
建立临时对象不能被转换成非const引用的构造函数,这样的类型不匹配。
运算符+两个参数加上const的。
你的构造函数是模糊的,来解决错误会出现在第一,0.5构建一个复杂的有差异时,这两个参数的构造函数的参数有默认值,编译器无法确定到底是哪。第二
构造是多余的,注释掉。
这两个平反自己运行没有问题。
运算符+两个参数加上const的。
你的构造函数是模糊的,来解决错误会出现在第一,0.5构建一个复杂的有差异时,这两个参数的构造函数的参数有默认值,编译器无法确定到底是哪。第二
构造是多余的,注释掉。
这两个平反自己运行没有问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重载+运算符只重载了两复数相加形式,你还要重载与实数相加的形式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C风格的字符串,用char*类型定义一个变量;C++有字符串类:string,直接定义成该类型的变量就可以了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询