导图社区 运算符重载
c++中运算符的重载,运算符重载就是给已有的运算符赋予多重含义,使同一个运算符作用于不同的数据时产生不同的行为。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
运算符重载
概念
运算符重载就是给已有的运算符赋予多重含义,使同一个运算符作用于不同的数据时产生不同的行为。
运算符重载的目的是是的运算符也能够用来操作对象。
C++允许重载大多数运算符,不允许重载的有:
成员访问运算符 .
成员指针访问运算符 . * ->*
域运算符 : :
长度运算符 sizeof
条件运算符 ?:
预处理符 #
用于类运算符通常都要重载
= 默认重载为成员变量的复制
& 默认重载为返回任何类对象的地址
运算符重载的实质是编写以运算符为名称的函数,试用运算符的表达式被解释为对重载函数的调用。
运算符重载的格式: 返回值类型 operator运算符(形参表){函数体}
运算符可以被重载为全局函数(通常是类的友元),参数个数为运算符的操作数个数。也可以重载为类的成员函数(一般倾向于重载为类的成员函数,参数个数为运算符操作数个数减1。
运算符重载表示为友元函数时,两个操作数都要列出
运算符重载的规则:
看重载运算符的含义应该副歌原有用法习惯
不能改变运算符原有的语义,包括优先级和结合性
运算符重载不能改变运算符操作数的个数及语法结构
不能创建新的运算符
重载“( )”、“[ ]”、“{ }”、“->”或者赋值运算符“=”时只能将他们重载为成员函数,不能重载为全局函数
运算符重载不能改变运算符用于基本数据类型对象的含义
重载赋值运算符
对任一类X,如果用户没有自定义的赋值运算符函数,那么编译系统将自动的为期生成一个默认的赋值运算符函数,默认赋值运算符函数重载形式如下: X&X : : operator=(const X & source) { 成员间赋值 }
重载赋值运算符解决复制不兼容问题,应该注意两点:
赋值运算符必须重载为成员函数
为了保持与通常意义以下的赋值运算符的功能相一致,应该让重载的赋值运算符仍然能连续使用,所以operator=函数通常要返回引用
浅拷贝与深拷贝
浅拷贝:同类对象之间可以通过赋值运算符"+"相互赋值,如果没有经过重载,"+"的作用就是将赋值号右侧对象的值一一赋值个左侧的对象,这想到与值的拷贝,称为浅拷贝。
深拷贝:重载赋值运算符,赋值语句的功能是将一个对象中指针成员变量指向的内容复制到另一个对象中指针成员变量指向的地方。
重载流插入运算符和流提取运算符
cout<< 插入流运算符 cin>> 提取流运算符 重载使之用于自定义的类对象,只能重载为类的友元
重载插入流运算符的一般格式: ostream &operator<<(ostream &outpuut, 类名&对象名) { ... return output }
重载提取流运算符的一般格式: istream &operator>>(istream &inpuut, 类名&对象名) { ... return input }
*重载强制类型转换运算符
类型转换运算符:在C++中,类型的名字(包括类的名字)本身也是一种运算符,即强制类型转换运算符,是单目运算符,只能重载为成员函数,经过重载后,“(类型名)对象”,就等价于“对象.operator 类型名()”。
重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是确定的。 经过适当的重载后,“(类型名)对象“这个对对象进行强制类型转换的表达式就等价于”对象operator 类型名()“,即变成对运算符函数的调用。
重载自增自减运算符
自加++、自减--运算符可以重载,但有前置和后置之分,用于对象也是如此。
C++规定,在重载“++”、“--”时,允许写一个增加了无用int类型形参的版本,编译器处理“++”、“--”前置表达式时,调用参数个数正常的重载函数;处理后置的表达式时,调用多出一个参数的重载函数。重载的后置运算符的形参表中有一个int类型的参数,它仅表明重载的是后置运算符,不需要定义形参变量,在函数体中也不必使用它。