📅  最后修改于: 2023-12-03 15:13:45.399000             🧑  作者: Mango
在 C++ 中,运算符重载是一种功能强大的特性,它允许用户自定义数据类型的行为,以便以与内置数据类型相似的方式进行操作。本文将介绍关于 C++ 运算符重载的问题9。
在 C++ 中,=
运算符有一个默认版本,可以执行将一个对象的值赋值给另一个对象的操作。然而,在某些情况下,这个默认行为并不适合我们的需求。问题9就涉及到了这个问题:如何重载赋值运算符 =
。
要重载赋值运算符,需要创建一个名为 operator=
的成员函数。这个函数必须返回一个引用,以便可以使用链式语法,同时,它还必须采用与对象类型相同的参数类型。
class MyClass {
// ...
public:
MyClass& operator=(const MyClass&);
};
MyClass& MyClass::operator=(const MyClass& rhs) {
// 在这里实现赋值操作
return *this;
}
在赋值运算符函数的实现中,最常见的做法是删除当前对象的内容,然后复制参数的值。以下是一种可能的实现:
MyClass& MyClass::operator=(const MyClass& rhs) {
if (this != &rhs) {
// 删除当前对象的内容
// 然后复制参数的值
}
return *this;
}
注意,赋值运算符的返回值必须是引用类型。如果返回的是值类型,那么在链式操作中会创建多个临时对象,导致性能问题。因此,必须返回一个引用,以便将一个值直接复制到运算符左侧的对象中。
以下是一个示例程序,演示如何使用自定义复数类重载赋值运算符 =
:
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) : m_real(r), m_imag(i) {}
double real() const { return m_real; }
double imag() const { return m_imag; }
Complex& operator=(const Complex& rhs) {
if (this != &rhs) {
m_real = rhs.m_real;
m_imag = rhs.m_imag;
}
return *this;
}
private:
double m_real;
double m_imag;
};
int main() {
Complex a(2, 3);
Complex b(1, 2);
a = b;
cout << "a = " << a.real() << " + " << a.imag() << "i" << endl;
return 0;
}
输出结果为:
a = 1 + 2i
通过这个问题,我们了解了如何重载赋值运算符 =
,以实现更适合自定义数据类型的行为。需要特别注意返回值的类型,以及在实现中对对象内容的清除和复制。