“不起眼”的运算符重载-C++

强颜欢笑 提交于 2020-01-28 08:41:36

引言

自己写程序的时候发现一个问题,别人构造的类,对象之间可以直接赋值,而我却只能求助于拷贝构造函数,这属实难顶
那应该怎么简单高效地copy类对象呢?这就轮到运算符重载登场了


干员资料 // 运算符重载简介

简单的说,运算符重载是实现编译时多态性(动态多态)的一种形式(另一种是虚函数),运算符重载是对已有运算符赋予多重含义,以适应用户自定义的数据类型的行为。

运算符重载的实质是函数重载。事实上,C++的每一个运算符对应着一个运算符函数,在实现过程中,把指定运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参(在编译阶段完成)eg. a+b --> operator+(a,b)可见,运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后的运算符构成的。

运算符函数的一般格式为:

<返回类型说明符> operator <运算符>(<参数表>)
{
	/* code */
}

特点character:

  1. 只能重载(大)部分C++提供的标准运算符,而且只能重载已有的运算符,不能自己另编。
  2. 参数个数固定,重载以后运算符的优先级和结合性都不改变,语法结构也不能改变。即对于一元运算符(前缀/后缀),有且仅有一个参数,只能重载为单目运算符;对于二元运算符(中缀),有且仅有两个参数,只能重载为双目运算符。
  3. 针对类对象进行操作。即重载函数的参数至少一个是class类型
  4. 运算符重载后的功能应与原有功能类似,含义必须清楚,不能有二义性

下面的运算符可重载:

分类 运算符
双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),–(自减)
位运算符 |(按位或),& (按位与),~(按位取反),^(按位异或),<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=,
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[ ](下标),{ }(花括号),类型转换运算符

**类型转换运算符包括int, char, long, float, int*, char*等

下面是不可重载的运算符列表:

分类 运算符
. 成员访问运算符
.* ,->* 成员指针访问运算符
:: 域运算符
sizeof 长度运算符
? : 条件运算符
# 预处理符号

运算符重载的形式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!