1. C++运算符重载基础概念
在C++编程中,运算符重载(operator overloading)是一项强大的特性,它允许我们为自定义数据类型定义运算符的行为。简单来说,就是让类对象也能像内置类型一样使用+、-、*、/等运算符进行运算。
运算符重载的核心思想是:通过operator关键字为类定义特殊的成员函数,这些函数决定了当该类的对象参与特定运算时的行为。例如,我们可以为自定义的复数类重载+运算符,使得两个复数对象可以直接相加。
注意:运算符重载不能改变运算符的优先级和结合性,也不能创建新的运算符符号。
运算符重载函数的一般形式为:
cpp复制返回类型 operator运算符符号(参数列表) {
// 函数体
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 可重载运算符详解
2.1 算术运算符重载
算术运算符是最常被重载的一类运算符,包括+、-、*、/、%等。让我们通过一个复数类的例子来说明:
cpp复制class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
// 重载+运算符
Complex operator+(const Complex& rhs) const {
return Complex(real + rhs.real, imag + rhs.imag);
}
// 重载-运算符
Complex operator-(const Complex& rhs) const {
return Complex(real - rhs.real, imag - rhs.imag);
}
};
使用示例:
cpp复制Complex c1(1.0, 2.0);
Complex c2(3.0, 4.0);
Complex c3 = c1 + c2; // 调用operator+
Complex c4 = c1 - c2; // 调用operator-
2.2 关系运算符重载
关系运算符(==、!=、<、>等)的重载通常返回bool值,用于比较两个对象。例如为复数类重载==运算符:
cpp复制bool operator==(const Complex& rhs) const {
return (real == rhs.real) && (imag == rhs.imag);
}
bool operator!=(const Complex& rhs) const {
return !(*this == rhs);
}
提示:实现!=运算符时可以利用已经实现的==运算符,避免代码重复。
2.3 赋值运算符重载
赋值运算符(=)的重载需要特别注意,因为它涉及到对象的深拷贝问题。默认的赋值运算符执行的是浅拷贝,对于包含指针成员的类,通常需要重载:
cpp复制class String {
private:
char* data;
size_t length;
public:
// 赋值运算符重载
String& operator=(const String& rhs) {
if (this != &rhs) { // 防止自赋值
delete[] data; // 释放原有资源
length = rhs.length;
data = new char[length + 1];
strcpy(data, rhs.data);
}
return *this; // 支持链式赋值
}
};
2.4 下标运算符重载
下标运算符([])常用于模拟数组行为,必须定义为成员函数:
cpp复制class IntArray {
private:
in
