重载运算符课程笔记

运算符重载使得用户自定义的数据以一种更简洁的方式工作

运算符重载的限制

  • 不能重载的运算符       “.”  “::”  “.*”  “?:”  “sizeof”

  • 不改变运算符的优先级

  • 不改变运算符的结合性

  • 不改变运算符所需要的操作数

  • 不能创建新的运算符

用成员或友元函数重载运算符

运算符可以重载为成员函数或者友元函数

  • 重载为成员函数

        ①一元运算符

            Object.operator op()

            操作数由对象Object通过this指针隐含传递

        ②二元运算符

             ObjectL.operator op (ObjectR)

            左操作数由ObjectL通过this指针传递,右操作数有参数ObjectR传递

成员运算符函数的原型在类的内部声明格式如下:

class X
{
   返回类型operator运算符(形参表)
}

在类外定义成员运算符函数格式如下:

返回类型X::operator运算符(形参表)
{
   函数体
}

对于双目运算符,成员函数形参表中只有一个参数,它作为运算符操作的右操作数,此时,当前对象作为运算符的左操作数,通过this隐含的传递给函数。

      在类中用成员函数重载双目运算符,成员运算符  operator该运算符  所需的一个操作数由对象aa通过this指针隐含地传递,它的另一个操作数bb在参数表中显示,aa,bb都是该类的对象,则下面两种函数调用方法是等价的:

aa运算符bb;                    //隐式调用

aa.operator运算符(bb);   //显示调用

        对于单目运算符来说,成员函数的参数表中没有参数,当前对象作为操作数

采用单目运算符时,下面两种方法是等价的:

运算符aa;                       //隐式调用

aa.operator运算符();         //显示调用

  • 重载为友元函数(友元函数不能重载的运算符“=”“()”“[]”“->”)

        ①一元运算符

            operator op(Object)

            操作数由参数表的参数Object提供

        ②二元运算符

            operator op(ObjectL,ObjectR)

            操作数由参数传递

使用友元函数时需注意:

  1. 在第一个参数需要隐式转换的情形下,使用友元函数重载
  2. 友元函数没有this指针,所需操作数都必须在参数表中显示
成员运算符函数与有缘运算符函数的比较
  1. 成员运算符函数比友元运算符函数少带一个参数(后置的++--需要增加一个形参)。

  2. 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但当操作数类型不相同时,必须使用友元函数。  

赋值运算符的重载

注意:

赋值运算符重载用于对象数据的复制

operator=必须重载为成员函数

重载方式:

     类名&类名::operator=(类名);

重载运算符[]和()

注意:

[]和()是二元运算符

[]和()只能用成员函数重载

格式分别为:

类型   类   ::operator[] (类型)

类型   类   ::operator()  (参数表)

重载流插入和流提取运算符

istream和ostream是C++的预定义流类

cin是istream的对象,cout是ostream的对象

运算符<<由ostream重载为插入操作,用于输出基本类型数据

运算符 >>由istream重载为提取操作,用于输入基本类型数据
(只能)用友元函数重载<<和>>,输出和输入用户自定义的数据类型


重载运算符可以让更快更容易地输入、输出我们需要的自定义数据,可以按照我们规定的方式进行运算,更好的控制不同的数据,是一种很好用的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值