一.概述
1.运算符
·运算符就是具备特殊功能的符号
·运算符本质上就是一个函数
2.运算符重载
·运算符重载的本质,就是在对象(类)中重载运算符函数
二.实现方式
1.定义运算符重载函数
1-1 名词说明
·左值与右值:简单来说,以赋值符号"="划分,在"="左边的就是左值,在"="右边的就是右值
·关键字:operator
1-2 运算符重载函数的定义
//FenShu是我定义的一个分数类
·举例:FenShu& operator+(const FenShu& fs) { /*函数体*/ };
·返回值:表达式的返回值,也就是最终的结果
·函数名:关键字加上运算符名(operator+)
·参数:操作数,也就是左值与右值
·函数体:重载后的运算符的具体实现
2.运算符重载的两种方式
2-1 重载运算符函数为类的成员函数
·当前对象(也就是this)为运算符的左值
·举例:FenShu operator+(const FenShu& fs);
2-2 重载运算符函数为类的友元(缘)函数
·友元函数不是类的成员变量
·友元函数中可以访问成员变量
·第一个参数为左值,第二个参数为右值
·举例:FenShu& operator+(const FenShu& fs1,const FenShu& fs2);
三.语法与规范
1.语法
·".(点运算符)"、"->(箭头运算符)"、"::(作用域运算符)"、"?:)"、"sizeof关键字"、"&(取地址)",除了这些,其他的运算符基本都能重载
·不能创建新的运算符,比如重载一个不存在的运算符
·遵循函数重载原则
2.规范
·双目运算符一般重载为友缘函数,单目运算符一般重载为成员函数
·不能修改运算符的规则:优先级、操作数个数、操作数类型
·重载后的运算符应与原运算符功能相同
四.重载时需注意的几个运算符
1.赋值运算符与拷贝构造的区别
·根据对象是否存在来判断,在构造对象时调用拷贝构造
FenShu fs1; Fenshu fs2 = fs1; //此时调用的是拷贝构造,还是赋值运算符 //答案是拷贝构造 //因为对象fs2不存在,所以要构造出对象,而此时给了一个fs1的对象,来当做参数,故这里调用了拷贝构造
2.输入输出运算符
·只能重载为友缘
·注意连用问题
·传入值是否改变,是否用const修饰
3.new与delete的重载动机
·内存泄漏:申请了内存但是没有及时释放
·手动内存分配需要注意内存泄漏问题,帮助排查内存泄漏
原文:https://www.cnblogs.com/Basics/p/13113593.html