运算符重载知识点

知识点

可重载运算符/不可重载运算符

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

双目算术运算符     + (加),-(减),*(乘),/(除),% (取模)

关系运算符     ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)

逻辑运算符     ||(逻辑或),&&(逻辑与),!(逻辑非)

单目运算符     + (正),-(负),*(指针),&(取地址)

自增自减运算符     ++(自增),--(自减)

位运算符         | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)

赋值运算符     =, +=, -=, *=, /= , % = , &=,|=, ^=, <<=, >>=

空间申请与释放     new, delete, new[ ] ,delete[]

其他运算符     ()(函数调用),->(成员访问),,(逗号),[](下标)

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

.:成员访问运算符

.*, ->*:成员指针访问运算符

:::域运算符

sizeof:长度运算符

?::条件运算符

#: 预处理符号

 

重载运算符的限制

重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:

不改变运算符的优先级

不改变运算符的结合性

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

不能创建新的运算符

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

 

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

1.      一元运算符

Object op    或    op Object

重载为成员函数,解释为:

         Object. operator op ()

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

重载为友元函数,解释为:

         operatorop (Object)

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

2.      二元运算符

ObjectL op ObjectR

重载为成员函数,解释为:

         ObjectL. operator op ( ObjectR )

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

重载为友元函数,解释为:

         operatorop ( ObjectL, ObjectR )

       左右操作数都由参数传递

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

class X {

   //…

返回类型 operator运算符(形参表);

  //…

}

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

返回类型 X::operator运算符(形参表)

{

     函数体

}

双目运算符重载为成员函数

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

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

   aa @ bb;                      // 隐式调用

aa.operator@(bb);     // 显式调用

单目运算符重载为成员函数

对单目运算符而言,成员运算符函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。

一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的:

   @aa;                      // 隐式调用

   aa.operator@();    // 显式调用

成员运算符函数operator @所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它的参数表中没有参数。

用友元函数重载

友元函数重载运算符常用于运算符的左右操作数类型不同的情况

在第一个参数需要隐式转换的情形下,使用友元函数重载

    运算符是正确的选择

 友元函数没有 this 指针,所需操作数都必须在参数表显式

    声明,很容易实现类型的隐式转换

 C++中不能用友元函数重载的运算符有

         =    ()    []    ->

成员运算符函数与友元运算符函数的比较

(1) 成员运算符函数比友元运算符函数少带一个参数(后置的++、--需要增加一个形参)。

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

重载赋值运算符

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

 operator= 必须重载为成员函数

重载函数原型为:

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

重载运算符[]和()

 运算符 [] 和 () 是二元运算符

 [] 和 () 只能用成员函数重载,不能用友元函数重载

1.  重载下标运算符 []

[] 运算符用于访问数据对象的元素

重载格式         类型  类 :: operator[]  ( 类型 ) ;

设 x 是类 X 的一个对象,则表达式

                   x[ y ]

         可被解释为

                   x. operator [ ] ( y )

2.  重载函数调用符 ()

() 运算符用于函数调用

重载格式         类型  类 :: operator()  ( 参数表  ) ;

设 x 是类 X 的一个对象,则表达式

                   x( arg1, arg2, … )

         可被解释为

                   x. operator () (arg1, arg2, … )

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

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

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

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

运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据

用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型

重载输出运算符“<<”(只能被重载成友元函数,不能重载成成员函数)

定义输出运算符“<<”重载函数的一般格式如下:

   ostream& operator<<(ostream& out,class_name&obj)

    {

         out<<obj.item1;

         out<<obj.item2;

         .. .

         out<<obj.itemn;

         return out;

}

重载输入运算符“>>” (只能被重载成友元函数)

定义输入运算符函数“>>”重载函数的一般格式如下:

   istream& operator>>(istream& in,class_name&obj)

    {

           in>>obj.item1;

           in>>obj.item2;

           . . .

           in>>obj.itemn;

           return in;

}

心得

还不会使用,对其中很多内容不理解,只能参考着尝试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值