引入:
在编译器中,我们可以很轻松的实现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;
}