一、为什么要进行运算符重载?
在我们编写程序时,我们需要用到自定义数据类型,但是我们普通的运算符只能正常操作系统内置的数据类型比如我们常用的int,double无法自动识别我们的自定义数据类型。例如你设置了一个Person类,他有年龄,身高,体重等属性,那你做两个Person对象相加时系统应该怎样运算呢?显而易见系统是不知道的,所以就要我们重载运算符,告诉编译器应该怎么进行运算,下面我将给大家分享几种常用的运算符重载。
运算符重载一般有类内实现和类外实现两种方法。
二、运算符重载的实现
实现运算符重载其实就是写一个函数,只不过这个函数的函数名是关键字operator后面跟上你要重载的运算符号,然后返回值类型是我们实际情况需要的返回值类型,比如我们重载要计算的是int类型,那么两个int类型相加肯定还是int类型返回值就写int类型,如果是Person类型那么两个Person类型相加返回值肯定是Person类型,然后再函数体中实现如何运算。
三、常见的两种运算符重载
3.1、加号运算符重载 “+”
我们先创建一个Person类,他有m_A属性和m_B属性两个属性,假设Person对象相加就是两个对象的m_A相加赋给新的m_A,两个对象的m_B相加赋给新的m_B。
首先我们类内实现加号运算符重载,类内实现时我们本身是一个对象,所以参数只需要传递一个Person对象,我们用引用的方法将他传递进来,最后实现相加。
class Person
{
public:
int m_A;
int m_B;
//类内实现加号运算符重载
Person operator+(Person& p)
{
Person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}
};
首先我们创建两个Person对象并给他的m_A和m_B赋值,然后我们计算p1+p2并把结果赋值给p3,最后输出p3。当我们没有写运算符重载函数时Person p3=p1+p2这行代码时会报错的,但是加了之后我们就能正常运行了,
void test01()
{
Person p1;
p1.m_A = 10;
p1.m_B = 20;
Person p2;
p2.m_A = 10;
p2.m_B = 21;
Person p3 = p1 + p2;
cout << "p3.m_A= " << p3.m_A << " p3.m_B= " << p3.m_B << endl;
}
全部代码如下
#include<iostream>
using namespace std;
class Person
{
public:
int m_A;
int m_B;
/*Person operator+(Person& p)
{
Person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}*/
};
Person operator+(Person& p1, Person& p2)
{
Person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
return temp;
}
void test01()
{
Person p1;
p1.m_A = 10;
p1.m_B = 20;
Person p2;
p2.m_A = 10;
p2.m_B = 21;
Person p3 = p1 + p2;
cout << "p3.m_A= " << p3.m_A << " p3.m_B= " << p3.m_B << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果如下
类外实现
运算符重载类外实现的话我们只需要在重载函数参数列表上添加两个参数即可实现如下:
Person operator+(Person& p1, Person& p2)
{
Person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
return temp;
}
3.2、左移运算符重载 “<<”
注意:左移运算符的重载不用类内函数重载,一般用全局函数重载。
我们还是创建Person类并以他为例举例。
如果对象的属性是私有成员,我们可以通过做友元的方法来实现左移运算符的重载,如果是公有成员我们就可直接重载,这里我们将属性设置为私有成员,方便我们练习友元,(如不知道什么是友元可翻看我往期文章有详细解答)
下面是重载代码,翻看"<<“运算符定义我们发现他的数据类型是输出流数据类型,所以我们返回值类型是ostream,我们在重载”<<“时还要重载一个输出流对象ostream out和一个要输出的对象Person p,我们都用引用的方式给他传进来,注意我们的返回值类型也用到了引用类型,这就要提到一个链式编程思维了,这里我们就先记住重载”<<"时返回值类型要用到引用就行。
class person
{
//"<<"重载全局函数做友元
friend ostream& operator<<(ostream& out, person& p);
public:
person(int a, int b)
{
m_a = a;
m_b = b;
}
private:
int m_a;
int m_b;
//左移运算符的重载不用类内函数重载,一般用全局函数重载
};
//"<<"重载函数
ostream& operator<<(ostream &out,person &p)
{
out << "m_a= " << p.m_a << " m_b=" << p.m_b << endl;
return out;
}
全部代码如下
#include<iostream>
using namespace std;
class person
{
//"<<"重载全局函数做友元
friend ostream& operator<<(ostream& out, person& p);
public:
person(int a, int b)
{
m_a = a;
m_b = b;
}
private:
int m_a;
int m_b;
//左移运算符的重载不用类内函数重载,一般用全局函数重载
};
//"<<"重载函数
ostream& operator<<(ostream &out,person &p)
{
out << "m_a= " << p.m_a << " m_b=" << p.m_b << endl;
return out;
}
void test01()
{
person p(10, 10);
cout << p << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
下面是运行结果