Petty C++ 运算符重载

在 C++ 中使用operator关键字为运算符提供不同的行为。

基本概念

重载运算符允许自定义行为。

重载运算符不改变运算符的固有优先级和结合性。

operator语法

Copy
type operator symbol(params)

其中，type是返回类型，operator symbol表示要重载的运算符。例如，加法运算符和加法赋值运算符的重载形式为：

Copy
// 加法
operator+
// 加法赋值
operator+=

一个简单的示例

以下示例展示了如何重载加法运算符：

Copy
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指针。

Copy
class MyClass {
public:
MyClass(int val) : data(val) {}

// 成员函数重载加法运算符
MyClass operator+(const MyClass& other) const {
return MyClass(data + other.data);
}

private:
int data;
};

全局函数重载：通过友元函数或普通函数实现，适用于需要对两个不同类型的对象进行操作的情况。

Copy
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);
}