【C++】运算符重载

引入:

在编译器中,我们可以很轻松的实现1+1;或者2.3+3.6;

对于运算符 + 而言,它的左值和右值都是int类型或double类型的数据类型,我们都知道数据类型之间可以作为运算符的操作对象。
但是假如目前我这里有个Student的类,类中有score分数,age年龄这些成员变量,Student类定义了两个对象,stu1和stu2;我可以使用运算符 + 来操作吗?

例如我想求一下stu1和stu2他们的分数总和,stu1 + stu2;这样肯定是不行的,因为运算符的操作对象都是一些基本的数据类型,而stu1和stu2都是类的对象,怎么能“直接”相加呢。
但是C++可以实现,C++最大的一个特征就是重载,就像函数可以重载一样,运算符也可以被重载。运算符重载主要就是面向对象之间的;

还是上面的例子,有人说可以stu1.score + stu2.score ;这样 + 左右都是int型,可以但是score作为私有成员不可被访问,有人继续说,我们可以设计一个成员函数,来调用类的sorce,我们可以设计一个名叫AddScore类内函数,返回值设为两个类的分数相加,然后调用AddScore函数来实现;

inline double
Student::AddScore (Student& stu) 
{
   return this->score + stu.score;
}

这种方法可以,但C++语言中有自己的对运算符重载的语法,可以更高效安全的来实现,这就是运算符重载。

1.1 运算符重载的语法

C++中,运算符重载格式是固定写法,使用operator关键字定义运算符重载,重载格式如下:

返回值类型 operator 运算符名称 (参数列表)

{

  ...//函数体

}

 1.2 运算符重载的方式

运算符重载主要有两种实现方式:

        1、通过类的成员函数

#include<iostream>
using namespace std;
class A
{
private:
	int _x;
	int _y;
public:
	A(int x=0,int y=0):_x(x),_y(y){}
	void show() const; 		//输出数据
	A operator++();  		//重载前置++
	A operator++(int); 		//重载后置++
};
void A::show() const
{
	cout<<"(_x,_y)="<<"("<<_x<<","<<_y<<")"<<endl;
}
A A::operator++()  			//前置++实现
{
	++_x;
	++_y;
	return *this;
}
A A::operator++(int) 	 	//后置++实现
{
	A a=*this;
	++(*this);  			//调用已经实现的前置++
	return a;
}
int main()
{
	A a1(1,2), a2(3,4);
	(a1++).show();
	(++a2).show();
	return 0;
}

    2、 通过友元声明全局函数

#include<iostream>
using namespace std;
class A
{
private:
	int _x;
	int _y;
public:
	A(int x=0,int y=0):_x(x),_y(y){}
	void show() const; 								//输出数据
	friend A operator+(const A& a1, const A& a2) ; //重载为类的友元函数
	friend A operator-(const A& a1, const A& a2);   //重载为类的友元函数
};
void A::show() const
{
	cout<<"(_x,_y)="<<"("<<_x<<","<<_y<<")"<<endl;
}
 A operator+(const A& a1,const A& a2)
{
	return A(a1._x+a2._x,a1._y+a2._y);
}
 A operator-(const A& a1,const A& a2)
{
	 return A(a1._x-a2._x,a1._y-a2._y);
}
int main()
{
	A a1(1,2);
	A a2(4,5);
	A a;
	cout<<"a1: "; 
     a1.show();
	cout<<"a2: "; 
     a2.show();
	a=a1+a2;
	cout<< "a: ";
     a.show();
	a=a1-a2;
	cout<<"a: ";
     a.show();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值