?C++允许运算符重载,这意味着程序员可以重新定义常用运算符(如+、-、*、/等)的行为,以便它们能够以新的方式在类或结构中使用。运算符重载是一种强大的工具,但如果不正确使用,也可能会引入混淆和错误。
以下是一些关于C++运算符重载的基本指导原则:
明确性:运算符重载应当使代码更清晰、更易于理解。如果一个运算符的重载导致代码变得难以理解,那么这个重载可能就不是一个好主意。
一致性:重载的运算符应当遵循C++中该运算符的常规行为。例如,如果你重载了+运算符,那么你的实现应该类似于内置类型的+行为。
不要改变运算符的优先级或结合性:重载运算符时,不应改变其优先级或结合性。
重载非成员函数:通常,运算符重载是作为非成员函数实现的,这样可以保持类的封装性。
返回类型:返回类型通常是基于操作数的类型。例如,对于二元+操作符,返回类型通常是两个操作数类型之一。
不要修改操作数:运算符重载应当不会修改其操作数。如果需要改变操作数的值,应当通过其他方式来实现,例如使用成员函数。
支持默认参数:有时你可能希望某些参数有默认值,这样你可以用更少的参数调用重载的运算符。
支持常量:考虑是否应该支持常量对象作为操作数。
支持引用:考虑是否应该支持引用作为操作数。这通常用于效率考虑。
考虑异常安全性:在实现重载的运算符时,要确保代码是异常安全的。
谨慎使用非常规运算符:避免重载如!!、<>、.*等非常规的、不易理解的运算符。如果必须重载这些运算符,务必提供足够的文档说明其用途和行为。
避免与标准库冲突:尽量不要与C++标准库中的类或函数使用相同的运算符重载。
#include <iostream>
?
class Complex {
public:
//接受两个参数:real和imag,分别表示复数的实部和虚部。
//在构造函数中,使用初始化列表的方式将这两个参数的值分别赋给成员变量real_和imag_
Complex(double real, double imag) : real_(real), imag_(imag) {}
?
// 重载加法运算符
Complex operator+(const Complex& other) const {
return Complex(real_ + other.real_, imag_ + other.imag_);
}
?
void print() const {
std::cout << real_ << " + " << imag_ << "i" << std::endl;
}
?
private:
double real_;
double imag_;
};
?
int main() {
Complex c1(1.0, 2.0);
Complex c2(3.0, 4.0);
Complex c3 = c1 + c2; // 使用重载的加法运算符
c3.print(); // 输出:4 + 6i
system("pause");
return 0;
}
?