C++多态性——(5)运算符重载(第二节)

2024-01-07 18:07:52

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏? + 留言?📝
身先才能率人,律己才能服人!

一起加油!

目录

一、运算符重载规则:

二、运算符重载为成员函数:?

例:复数类乘法运算重载为类的成员函数?。

说明:

?三、运算符重载为友元函数:

例:运算符重载为类的友元函数,实数与复数的加减运算。?


一、运算符重载规则:

????????运算符重载规则说明如下。

  • ????????(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++多态性的理解,请持续关注我哦!!!?

文章来源:https://blog.csdn.net/2301_80585598/article/details/135432990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。