为了使一个定义在类中的复数能够和一个整型数据直接通过加法运算符相加,写了几个重载函数,
#include<iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;image=0;}
Complex(double r,double i){real=r;image=i;}//初始化的构造函数
Complex(double r){real=r;image=0;}//转换构造函数
Complex operator+(Complex &c2);//在一个复数左加另一个复数的情况下
Complex operator+(double &i);//在一个复数左加一个双精度浮点数的情况下
friend Complex operator+(double &i,Complex &c2);//友元函数,在一个浮点数加左加一个复数的情况下
void display();//输出函数
private:
double real;
double image;
};
Complex operator+(double &i,Complex &c2)
{return Complex(i+c2.real,c2.image);}
Complex Complex::operator+(Complex &c2)
{return Complex(real+c2.real,image+c2.image);}
Complex Complex::operator+(double &i)
{return Complex(i+real,image);}//重载
void Complex::display()
{cout<<"("<<real<<","<<image<<"i)"<<endl;}
int main()
{
Complex c1(2,-3),c2(4,5),c3;
c3=c1+2.5;//报错段
c3.display();
return 0;
}
但是编译器一直报错,提示不能直接将一个类中的数据与浮点数直接相加。
起初百思不得其解,甚至一度怀疑是浮点型不能参与重载,直到重新翻了引用的定义才明白。
引用是作为变量的别名,而我在重载时用的是引用,实际使用时给的却是一个常量,所以不会调用重载函数。
在把&引用标识符去掉之后,问题就解决了。
#include<iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;image=0;}
Complex(double r,double i){real=r;image=i;}//初始化的构造函数
Complex(double r){real=r;image=0;}//转换构造函数
Complex operator+(Complex &c2);//在一个复数左加另一个复数的情况下
Complex operator+(double i);//在一个复数左加一个双精度浮点数的情况下
friend Complex operator+(double i,Complex &c2);//友元函数,在一个浮点数加左加一个复数的情况下
void display();//输出函数
private:
double real;
double image;
};
Complex operator+(double i,Complex &c2)
{return Complex(i+c2.real,c2.image);}
Complex Complex::operator+(Complex &c2)
{return Complex(real+c2.real,image+c2.image);}
Complex Complex::operator+(double i)
{return Complex(i+real,image);}//重载
void Complex::display()
{cout<<"("<<real<<","<<image<<"i)"<<endl;}
int main()
{
Complex c1(2,-3),c2(4,5),c3;
c3=c1+2.5;//成功
c3.display();
return 0;
}