文章目录
- 回答重点:
- 示例:
- 运算符重载的基本规则和注意事项:
回答重点:
C++的运算符重载是指可以为自定义类型(如类或结构体)定义运算符的行为,使其像内置类型一样使用运算符。通过重载运算符,开发者可以对类对象使用常见的运算符(如+
, -
, *
, ==
, []
等),并为它们赋予特定的操作逻辑。
- 重载的运算符仍然遵守其原有的优先级和结合性。
- 重载必须是通过类成员函数或友元函数实现。
- 不能重载的运算符:
::
、.*
、.:
、sizeof
、typeid
、const_cast
等。
示例:
class Complex {
public:int real, imag;Complex(int r = 0, int i = 0) : real(r), imag(i) {}// 重载 + 运算符Complex operator + (const Complex &obj) {return Complex(real + obj.real, imag + obj.imag);}
};
重载+后,以下代码就可以正常工作:
Complex a(1.0, 2.0);
Complex b(3.0, 4.0);
Complex c = a + b; // 使用重载的+运算符
运算符重载的基本规则和注意事项:
-
只能重载已有的运算符,不能创建新的运算符。
比如+
运算符可以重载,但不能创建一个新的运算符。 -
不能改变运算符的优先级、结合性和内在语义。
重载只改变运算符的操作对象和行为,但在表达式中的优先级和结合性是固定的,也不能改变其在基本类型上的预期行为。例如,不能让+
运算符变成减法。 -
有些运算符不能被重载。
比如.
(成员访问运算符)、?:
(三元条件运算符)等不能被重载。但是大多数运算符符合相应的规定都可以重载。 -
运算符重载可以作为成员函数或全局函数。
作为成员函数时,第一个参数隐含为this
指针。如果需要对两个不同类型的对象进行操作,通常会使用全局函数形式重载,同时全局函数形式需要使用友元声明访问类的私有成员。
class Complex {
public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 声明为友元函数,使其访问私有成员friend Complex operator+ (const Complex& lhs, const Complex& rhs);private:double real;double imag;
};// 作为全局函数重载 + 运算符
Complex operator+ (const Complex& lhs, const Complex& rhs) {return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);
}
- 运算符重载要确保符合逻辑和直观,以免造成困惑。例如,
==
运算符通常用于比较对象是否相等,那么它的返回值应该是一个布尔值。