1.c++内置了大量的运算符供编程人员使用,但是有时候内置的运算符并不能满足我们的需求,例如对于我们自定义类的操作之中
int a{0}, b{1};
int c = a + b; //对于两个整数,+运算符可以满足需求。
//对于自定义类,+运算符无法满足需求
//自定义一个类People,包含两个属性年龄和名字
class People {
public:
private:
int peopleAge;
string peopleName;
};
//此时想要实现两个People类相加是办不到的
2.为了使得运算符能够满足我们的需求,c++提供了对运算符重载的功能,通过关键字
operator
实现对于运算符+的重载;
//对运算符+重载,实现两个People类的加法
People operator+(const People &p1, const People &p2) {
People p;
p.peopleAge = p1.peopleAge + p2.peopleAge;
p.peopleName = p1.peopleName + p2.peopleName;
return p;
}
为了重载后的+能够访问到类内部属性,将该函数设置为People类的友元函数,同时完善类的构造函数。
class People {
public:
People () {
this->peopleAge = 0;
this->peopleName = "";
}
People (int age, string name) : peopleAge(age), peopleName(name) {}
People (const People &p) : peopleAge(p.peopleAge), peopleName(p.peopleName) {}
friend People operator+(const People &p1, const People &p2);
private:
int peopleAge;
string peopleName;
};
此时就能够实现对两个People类的相加
People p1{18, "Dog"};
People p2{20, "Cat"};
People p3 = p1 + P2;
//此时p3.peopleAge == 38, p3.peopleName == "DogCat"
3.我们也可以在类内对+进行重载,使之成为People类的一个方法。在类内进行运算符重载,那么重载后的运算符函数就是该类的成员函数,那么这时候该运算符左侧运算对象(如果有的话)就默认是 this 指针指向的对象。所以在类内重载运算符时显式参数数量比类外重载运算符实现相同的功能时少一个。
class People {
public:
People () {
this->peopleAge = 0;
this->peopleName = "";
}
People (int age, string name) : peopleAge(age), peopleName(name) {}
People (const People &p) : peopleAge(p.peopleAge), peopleName(p.peopleName) {}
friend People operator+(const People &p1, const People &p2);
People operator+(const &p) {
this->peopleAge += p.peopleAge;
this->peopleName += p.peopleName;
return *this;
}
private:
int peopleAge;
string peopleName;
};
此时同样运行对两个People类进行相加的代码 ,此时结果和上一次运行有了些许的不同
People p1{18, "Dog"};
People p2{20, "Cat"};
People p3 = p1 + P2;
//此时p3.peopleAge == 38, p3.peopleName == "DogCat"
//值得注意的是,由于在类内对+也进行了重载,所以 People p3 = p1 + p2 做了两步工作
第一次运行p3 获得 p1 和 p2 相加的结果,第二次运行时,该代码做了两步工作。
首先是和第一次一样,p3 获得 p1 和 p2 相加的结果。但是由于类内又一次重载+, 所以
p1 + p2
就相当于p1在类内调用了重载函数,传入的参数为 p2 的常量引用,所以p1自身也实现了 p1 和 p2 的相加,也就是说在这时p1 和 p3 的属性是相同的。
4.总结
运算符重载类似于重载函数,我们可利用 operator 关键字对我们想要的运算符定义相应的运算,同时可以运用重载函数的相关知识对运算符进行不同的重载。如果我们把一个运算符看作是一个函数,那么运算符重载和重载函数就非常类似了。实际上,重载运算符确实可以看作是具有特殊名字的函数。