【C++入门】(十七)运算符重载
1. 如何在成员函数中重载运算符?
1.1 前 / 后 缀运算符
-
前缀运算符:
const Counter& operator++();
-
后缀运算符:
const Counter operator++(int);
后缀中 int 根本没有使用它,只是用来区分 前 / 后 缀运算符
class Counter { public: // 1.前缀运算符导致修改变量的值,再在表达式中使用修改后的新值 const Counter& operator++(); //类内声明 // 2.(int)表示后缀运算符,必须按值(而不是按引用)返回,否则函数返回时,将不再在作用域内 const Counter operator++(int); int value; }
// 1.前缀运算符(类外定义),const引用防误修改 const Counter& Counter::operator++() { ++value; return *this; }
// 2.后缀运算符(类外定义),const引用防误修改 const Counter Counter::operator++(int) { Counter temp(*this); ++value; return temp; }
1.2 加法运算符
运算符重载避免了显式调用函数,让程序更容易使用和理解
eg: gamma = Alpha + Beta; // 编译器将调用 gamma = Alpha.operator+(Beta);
gamma = Alpha.add(Beta); // 如果写一个add()方法来实现相同的功能
1.3 运算符重载的限制
-
运算符的优先级不能被重载改变。然而,圆括号能够强制改变表达式中重载运算符的求值顺序
-
重载运算符时不能创造新的运算符,即只能重载现有的运算符
-
不能将“+”运算符重载为减,运算符旨在方便使用和理解
-
关系运算符,如
+
和+=
必须被单独重载。 -
不能被重载的运算符:
.
(类属关系符)、.*
(成员指针运算符)、::
(作用域分辨符)和? :
(三目运算符)。
2. 如何重载赋值运算符以管理内存?
2.1 赋值运算符
编译器自动生成默认赋值运算符重载同样是等位赋值(浅拷贝),会造成内存泄漏和重析构
class A { int num; c = new char[100]; }; int main() { A a; A b; a = b; //此时就是调用的赋值运算符重载 }
要避免浅拷贝出现内存泄露的情况,那么就要自定义赋值运算符重载,使用深拷贝
A & operator=(const A & other) { if(this == &other) // 判断右操作数是否为当前对象,以避免意外情况下对象赋给自己,被误释放 return *this; //释放,再重新分配内存,避免内存泄露 delete num; num = new int; num = other.getnum(); return *this; //返回新对象,链式编程 }
2.2 赋值运算符和复制构造函数
-
复制构造函数使用现有对象创建新对象
-
赋值运算符修改现有对象,使其值和另一对象相同
3. 如何在类中包含动态分配的变量?
3.1 转换运算符
将对象转换为内置类型
class Person { public: int num =10; Person(); //默认构造函数 Person(int NewNum); //构造函数重载版本,接受一个int参数 }; Person::Person(int NewNum): num(NewNum) {} int main() { int num1 = 20; Person P = num1; //将内置类型变量赋给类对象 cout << P.num; //P.num = 20 }
3.2 int()运算符
class Person { public: int num; Person(); Person(int NewNum); operator int(); //转换运算符 }; Person::Person(int NewNum): num(NewNum) {} Person::operator int(){ return (num); } //返回成员变量num,和函数声明中返回类型匹配 int main() { Person P(100); int num1 = P; //将类对象赋给内置类型变量 cout << num1; // num1 = 100 }
分类:
技术栈 / C++学习笔记
标签:
C++学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具