1. 运算符重载的核心概念
运算符重载是C++中一项强大的特性,它允许我们为自定义类型定义运算符的行为。本质上,运算符重载是一种特殊的函数重载形式,通过operator关键字后接运算符符号来定义。
注意:运算符重载不能改变运算符的优先级和结合性,也不能创建新的运算符符号。
运算符重载函数可以是成员函数或非成员函数(通常是友元函数)。作为成员函数时,左侧操作数隐式地是当前对象;作为非成员函数时,所有操作数都需要显式传递。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 赋值运算符重载详解
2.1 基本实现原理
赋值运算符(=)重载的核心是实现对象的深拷贝。与拷贝构造函数不同,赋值运算符需要处理对象已经存在的情况,因此必须正确处理自我赋值和资源释放问题。
cpp复制class MyString {
public:
// 赋值运算符重载
MyString& operator=(const MyString& other) {
if (this != &other) { // 1. 检查自我赋值
delete[] data; // 2. 释放原有资源
length = other.length;
data = new char[length + 1]; // 3. 分配新资源
strcpy(data, other.data); // 4. 拷贝数据
}
return *this; // 5. 返回引用支持链式赋值
}
};
2.2 异常安全实现
上述实现存在潜在问题:如果在new操作时抛出异常,对象将处于无效状态。更安全的实现方式是:
cpp复制MyString& operator=(const MyString& other) {
if (this != &other) {
char* newData = new char[other.length + 1]; // 先分配
strcpy(newData, other.data);
delete[] data; // 后释放
data = newData;
length = other.length;
}
return *this;
}
2.3 移动赋值运算符
C++11引入了移动语义,可以更高效地处理临时对象:
cpp复制MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[
