归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏? + 留言?📝
晚上想想千条路,早上醒来走原路!——马云
一起加油!
????????基本的数据类型可以用C++语法规定的运算符进行运算,但自定义的数据类型不能直接使用。用户有时会自定义一些数据类型,希望也可以很方便地使用这些运算符。一个复数z可以表示为z=x+yi,x、y均为实数,分别称为的实部和虚部,若两个复数z1=x1+y1i,z2=x1+y2i,则两个复数的加法、减法计算公式分别如下:
z1+z2 =x1+x2 +(y1+y2)i;
z1-z2=x1-x2 +(y1-y2)i;
?????????为了完成复数的加减法,在下例中定义了add(),sub()两个成员函数。
????????本例中add(),sub()函数为类Complex 的成员函数,由于做加法运算和减法运算都需要两个操作数,成员函数必须由一个 Complex类对象来调用调用add(),sub()的对象就是第一个左操作数。因此,这两个函数中需要传入的形参是右操作数,即第二个操作数。因此两个函数的形参只有一个,类型为 Complex 类的对象。复数相加、相减后,返回的也是一个复数,所以返回值也为Complex类型。
#include<iostream>
using namespace std;
class Complex{
protected:
double real,image;
public:
Complex(double px=0,double py=0)
{
real=px;
image=py;
}
Complex add(Complex c);
Complex sub(Complex c);
void print();
};
Complex Complex::add(Complex c)
{
return Complex(real+c.real,image+c.image);
}
Complex Complex::sub(Complex c)
{
return Complex(real-c.real,image-c.image);
}
void Complex::print()
{
if(image<0.0)
{
cout<<"("<<real<<image<<"i)"<<endl;
}
else
{
cout<<"("<<real<<"-"<<image<<"i)"<<endl;
}
}
int main()
{
Complex a(1.8,-2.4),b(4.3,4.7);
Complex c=a.add(b);
Complex d=a.sub(b);
c.print();
d.print();
return 0;
}
????????通过一定的处理后,C++默认的运算符也可以作用在自定义的数据类型Complex 上,使用系统内置的运算符完成自定义数据类型对象的运算可以使程序具有更好的可读性,书写也更加方便。
????????当然,我们不能直接把语句“Complex c =a.add(b)”改写为:“Complex c=a+b”,否则编译后出现错误,因为C++中的运算符默认只能作用于基本的数据类型,要想使这些运算符作用于用户自己定义的数据类型,我们必须定义当运算符作用于某个类对象时,具体做什么操作,这就是运算符重载。
????????C++中通过运算符重载机制可以使得系统原有的运算符具有多重含义,当它作用在用户自定义的数据类型上时,就按运算符重载时定义的运算规则进行运算。
????????运算符重载的实质就是函数重载,在实现的过程中,首先把相应的表达式转换成对运算符重
载函数的调用,将操作数转化为运算符重载函数的实参;然后根据参数匹配的原则确定需要调用的运算符重载函数,这个过程在编译过程中采用静态联编的方式完成。运算符重载的一般语法形式为:?
返回值类型 operator 运算符(形参表)
{
????????????? 函数体
}?
????????运算符重载的实质是函数重载,重载+、-运算,首先要定义两个函数operator+和operator-分析后我们发现,这两个函数与上例中的add和sub形式几乎是完全一致的。?
#include<iostream>
using namespace std;
class Complex{
protected:
double real,image;
public:
Complex(double px=0,double py=0)
{
real=px;
image=py;
}
Complex operator+(Complex c);
Complex operator-(Complex c);
void print();
};
Complex Complex::operator+(Complex c)
{
return Complex(real+c.real,image+c.image);
}
Complex Complex::operator-(Complex c)
{
return Complex(real-c.real,image-c.image);
}
void Complex::print()
{
if(image<0.0)
{
cout<<"("<<real<<image<<"i)"<<endl;
}
else
{
cout<<"("<<real<<"-"<<image<<"i)"<<endl;
}
}
int main()
{
Complex a(1.8,-2.4),b(4.3,4.7);
Complex c=a+b;
Complex d=a-b;
c.print();
d.print();
return 0;
}
?????????以上就是我对C++多态性——(5)运算符重载(第一节)的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!!?