C++多态性——(5)运算符重载(第二节)
归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏? + 留言?📝
身先才能率人,律己才能服人!
一起加油!
目录
一、运算符重载规则:
????????运算符重载规则说明如下。
- ????????(1)运算符重载的实质是函数重载,可以对大部分的运算符进行重载,这是 C++的重要特C++编译器根据参数个数和类型来决定调用哪个函数重载,同一个运算符可以定义几个运算符重载函数来进行不同的操作。运算符重载返回类型可以是任意的,通常与操作数类型相同。
- ????????(2)重载后的运算符所做的操作要尽量保持原来的意义,否则会降低程序的可读性。
- ????????(3)C++中,用户不能定义新的运算符,只能对已有的运算符进行重载。有六个运算符不能重载:成员访问运算符“.”,成员指针运算符“->”和“*”,作用域运算符“::”,sizeof运算符和三目运算符“?:”
- ????????(4)重载运算符与预定义运算符的使用方法完全相同,它不能改变原来运算符的参数个数也不能改变其优先级。
????????实现运算符重载是通过 operator 关键字实现的,运算符重载一般可以通过类的成员函数和类的友元函数来实现。
二、运算符重载为成员函数:?
????????运算符重载为类的成员函数后,作为类的成员函数它可以任意访间类中的私有成员。在实际使用时,类中的成员函数总是通过该类的对象来访问的,如果是双目运算符,左操作数一定是访问成员函数的对象本身,另一个操作数通过运算符重载函数的参数表来传递;如果是单目运算符,操作数就是访问成员函数的对象本身,不需要再传递任何参数。
例:复数类乘法运算重载为类的成员函数?。
#include<iostream>
using namespace std;
class complex{
private://私有接口
double real,image;
public://公有接口
complex(double r=0.0,double i=0.0):real(r),image(i){ }
~complex(){ }
complex operator*(const complex& c)const;//定义两个复数乘法运算
complex operator*(const double& c)const;//定义复数与实数的乘法运算
void print()const;
};
void complex::print()const
{
cout<<"("<<real<<","<<image<<")"<<endl;
}
complex complex::operator*(const complex& c)const
{
return complex(real*c.real-image*c.image,real*c.image+image*c.real);
}
complex complex::operator*(const double& c)const
{
return complex(real*c,image*c);
}
int main()
{
complex c1(3,4),c2(7,8),c3;
c3=c2*c1;
cout<<"c2:";
c2.print();
cout<<"c1";
c1.print();
cout<<"c2*c1";
c3.print();
c3=c2*5.0;
cout<<"c2*5.0";
c3.print();
return 0;
}
说明:
????????在本例中将复数的乘法重载为复数类的成员函数,由于复数可以与另一个复数进行乘法运算,也可以和另一个实数进行乘法运算,因此这里重载了两种形式。运算符重载为成员函数,除函数名称必须使用 operator<运算符>之外,其他与普通成员函数没有什么区别。在使用时可以采用成员函数调用的方式,也可以采用直接通过运算符对复杂操作数操作的方式。重载后的运算符原有的功能不受影响。因此,相同的运算符作用于不同的对象,就会导致不同的操作行为,从而体现了C++的多态性。?
?三、运算符重载为友元函数:
????????友元函数是类的“朋友”,它可以自由地访问类的所有成员。与重载为类的成员函数不同当运算符重载为类的友元函数时,由于友元是外部函数,不存在对象调用它,因此运算符所需要的操作数都需要通过函数的形参来传递,形参参数表中参数从左至右的顺序就是运算符操作数的顺序。
例:运算符重载为类的友元函数,实数与复数的加减运算。?
#include<iostream>
using namespace std;
class complex{
private:
double real,image;
public:
complex(double r=0.0,double i=0.0):real(r),image(i){ }
~complex(){ };
friend complex operator+ (double c1, const complex & c2);
friend complex operator-(double c1,const complex & c2);
void print()const;
};
void complex::print()const
{
cout<<"("<<real<<","<<image<<")"<<endl;
}
complex operator+ (double c1,const complex & c2)
{
return complex(c1+c2.real, c2.image);
}
complex operator- (double cl,const complex & c2)
{
return complex(cl-c2.real,-c2.image);
}
int main()
{
complex c1(3,4),c2;
c2=4+c1;
cout<<"4+";
c1.print();
cout<<"结果为:";
c2.print();
c2=4-c1;
cout<<"4-";
c1.print();
cout<<"结果为:";
c2.print();
return 0;
}
????????运算符重载的一般规律有如下几点。
- ????????(1)运算符既可以重载为类的成员函数,也可以重载为类的友元函数。
- ????????(2)对于双目运算符,重载为类的成员运算符函数,有一个参数,重载为类的友元运算符函数带有两个参数;对于单目运算符,重载为成员运算符函数不带参数,重载为类的友元运算符数带有一个参数。
- ????????(3)目运算符一般可以被重载为友元运算符函数或成员运算符函数,如果第一个操作数是基本数据类型则必须使用友元:=、( )、[ ],只能重载为类的成员函数;+=、-+、/=、!=、~=、%=、>=、<= 建议重载为成员函数;其他双目运算符建议重载为友元函数。??
????????以上就是我对C++多态性——(5)运算符重载(第二节)的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!!?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!