在C++中,运算符重载允许重新定义已有运算符的行为,以便让它们适用于自定义类型。这样,你可以通过自定义类型使用内置运算符,使得代码更加直观和易读。
此时我在代码中定义一个新类MyString
:
class MyString {
public:
int m_nNumberA;
int m_nNumberB;
public:
MyString() {};
//带有初始化列表的构造函数(这个知识点如果不清楚可以看我之前的文章)
MyString(int NumberA, int NumberB) :m_nNumberA(NumberA), m_nNumberB(NumberB) {};
};
这个时候我在主程序中创建两个MyString类的对象,并让两个对象相加,
MyString StringObjA(20,30);
MyString StringObjB(40,50);
MyString StringC = StringObjA + StringObjB;
可以看到代码报错,原因就是这个时候我并没有对运算符(+})进行重载,导致编译器并不清除自定义类的两个实例化对象相加到底要进行什么样的操作;我们可以通过运算符(+)重载对自定义类的对象进行的运算:
此时我希望两个对象相加最后得到的结果是两个对象的m_nNumberA
和m_nNumberB
分别相加。
运算符重载通常是在成员函数或者全局函数来实现的。通过在类定义中声明特定的运算符函数,并在函数体内定义对应的操作,就可以实现对该运算符的重载。
接下来就以加号(+)为例子,阐述如何对双目运算符进行重载。
运算符重载格式:
返回类型 operator运算符(参数列表) {
// 函数体
}
全局运算符重载
全局函数运算符重载的代码如下:
MyString operator+(const MyString &strObjA,const MyString &strObjB) {
MyString tempObject;
tempObject.m_nNumberA = strObjA.m_nNumberA + strObjB.m_nNumberA;
tempObject.m_nNumberB = strObjA.m_nNumberB + strObjB.m_nNumberB;
return tempObject;
}
定义了一个全局函数 operator+
,用于重载加法运算符 +
,使得 MyString
类型的对象可以使用 +
运算符进行相加操作。(如果要重载的是减法运算符那么可以写成 operator-
,以此类推。)
MyString operator+(const MyString &strObjA,const MyString &strObjB)
这行代码定义了一个返回类型为 MyString
的函数 operator+
(重载运算符+
的格式),接受两个MyString
类型的常引用参数 strObjA
和 strObjB
。在函数中定义了一个名为 tempObject
的 MyString
类型的临时对象,用于保存两个参数对象相加后的结果,计算完成后将tempObject
对象返回即可。
此时运行程序,得到结果:
MyString StringObjA(20,30);
MyString StringObjB(40,50);
MyString StringC = StringObjA + StringObjB;
std::cout << StringC.m_nNumberA << std::endl;
std::cout << StringC.m_nNumberB << std::endl;
可以看到对象StringC
的m_nNumberA
和m_nNumberB
的值对象StringObjA
和对象StringObjB
的m_nNumberA
和m_nNumberB
分别相加得到。
类内运算符重载
class MyString {
public:
int m_nNumberA;
int m_nNumberB;
public:
MyString() {};
MyString(int NumberA, int NumberB) :m_nNumberA(NumberA), m_nNumberB(NumberB) {};
//类内进行重载
MyString operator+(MyString &objB){
MyString objTemp;
objTemp.m_nNumberA = this->m_nNumberA + objB.m_nNumberA;
objTemp.m_nNumberB = this->m_nNumberB + objB.m_nNumberB;
return objTemp;
};
};
对于类内重载的成员函数来说,只需要传入一个参数是因为第二个操作数已经被隐式地传递给了该成员函数的隐式 this
参数。在成员函数内部,this
指针指向调用该成员函数的对象。
在这个成员函数中,this
指针指向了调用对象的地址,即 StringObjA
,而参数 other
则是显式传递的第二个操作数,即 StringObjB
。因此,类内重载的成员函数只需要一个显式参数,因为第一个操作数隐式地由 this
指针表示。
那么此时再运行程序,结果为:
int main() {
MyString StringObjA(20,30);
MyString StringObjB(40,50);
MyString StringC = StringObjA + StringObjB;
std::cout << StringC.m_nNumberA << std::endl;
std::cout << StringC.m_nNumberB << std::endl;
system("pause");
return 0;
}
可以看到对象StringC
的m_nNumberA
和m_nNumberB
的值由对象StringObjA
和对象StringObjB
的m_nNumberA
和m_nNumberB
分别相加得到。
上述例子是对+
进行重载,-
*
/
亦然。