在 C++ 中使用operator
关键字为运算符提供不同的行为。
基本概念#
- 重载运算符允许自定义行为。
- 重载运算符不改变运算符的固有优先级和结合性。
operator
语法#
type operator symbol(params)
其中,type
是返回类型,operator symbol
表示要重载的运算符。例如,加法运算符和加法赋值运算符的重载形式为:
// 加法
operator+
// 加法赋值
operator+=
一个简单的示例#
以下示例展示了如何重载加法运算符:
class MyClass {
public:
MyClass(int val) : value(val) {}
// 重载加法运算符
MyClass operator+(const MyClass& other) const {
return MyClass(value + other.value - 1);
}
int getValue() const {
return value;
}
private:
int value;
};
不可重载的运算符#
C++ 中大多数运算符都可以重载,但由于编译器的实现原理,以下运算符不能被重载:
.
.*
::
?:
- 一些非符号运算符
- sizeof
- typeid
- const_cast
- dynamic_cast
- static_cast
成员函数重载和全局函数重载#
- 成员函数重载:通过类的成员函数实现,此时第一个参数是隐式的
this
指针。
class MyClass {
public:
MyClass(int val) : data(val) {}
// 成员函数重载加法运算符
MyClass operator+(const MyClass& other) const {
return MyClass(data + other.data);
}
private:
int data;
};
- 全局函数重载:通过友元函数或普通函数实现,适用于需要对两个不同类型的对象进行操作的情况。
class MyClass {
public:
MyClass(int val) : data(val) {}
// 声明友元函数以访问私有成员
friend MyClass operator+(const MyClass& lhs, const MyClass& rhs);
private:
int data;
};
// 全局函数重载加法运算符
MyClass operator+(const MyClass& lhs, const MyClass& rhs) {
return MyClass(lhs.data + rhs.data);
}