运算符重载

C++中的运算符
1。大多数系统预定义运算符都能重载
. :: ?: # *
?:不值得重载
#不能被重载
2
重载不能改变优先级
不能改变结合性
不能改变运算符所需操作数的个数
重载后,可按这些运算符的表达方式使用
运算符重载的语法
一、通过运算符重载函数进行重载
1。运算符重载函数是成员函数
   语法形式:
Type X::operator@(参数表)
  {
    //相对于该类而定义的操作
   }
void x::operator +(参数表)
2.运算符重载函数是友元函数
  语法形式:
Type operator@(参数表)
  {
    //相对于该类而定义的操作
   }
注意:重载中注意的问题
1、运算符重载函数是友元函数、成员函数的区别;
2、运算符被重载时,只是相对一特定类被重载,在特定的环境下作出特定的解释。当离开这个特定环境后,具有原来的意义(系统定义);
3、当重载运算符解释失败时,用该运算符的预定义版本(系统)进行解释;
4、用此方法重载时,只能对一个系统已有运算符进行特定环境下的新的解释,而不能创造新的运算符。当运算符不够用时,用函数调用来实现;
5、除“=”以外,重载的运算符可以被任何派生类所继承,“=”需要每个类明确定义自己的解释;
6、 重载可能让程序的可读性下降,在使用时应模仿运算符的习惯用法 。
一元和二元运算符
一、运算符重载函数定义的两种方式
1、成员函数和友元函数
2、差别的关键原因:this指针
二、一元运算符
1、不论前缀还是后缀,需要一个操作数
2、对于任意一元运算符α:
(1)成员函数重载运算符
    定义          type x::operator α( )
                      {…}
    显式调用      objX.operator α( )
    隐式调用      αobjX  或:ojbXα
(2)友元函数重载运算符
    定义           type operator α(Xobj)
                      {…}
    显式调用       operatorα(obj X)
    隐式调用       αojbX  或:objX α
一元操作符
成员函数 操作数通过THIS指针隐含传递,因此参数表为空。
友元函数 所需要的一个操作数在参数表中,由对象显式地提供
二元操作符
成员函数 第一个操作数通过THIS指针隐含传递,第二个操作数通过参数提供,只有一个参数。
友元函数 所需要的两个操作数在参数表中,由对象显式地提供。

(1)成员函数重载运算符
    定义   Type X::operator β(X obj)
{

}
    显式调用      objX1.operator β(objX2)
    隐式调用      objX1 β(objX2)

(2)友元函数重载运算符
    定义 Type operator β( X ojb)
{

}

    显式调用  operator β(objX1, objX2)
    隐式调用  objX1 β(objX2)
成员函数重载运算符,激活运算符的对象都是由THIS指针隐含传递的。
二、实例
Class X
  {
   …
   X operator ++()
 {
  a++;
  b++;
  return *this;
 }
  X operator ++(int x)
 {
  X temp;
  a++;
  b++;
  return temp;
 }


用友元函数重载运算符
Class X
  {
   …
   friend operator ++(Y &a)
 {
  a.x++;
  b.y++;
  return a;
 }
  friend operator ++(Y &a, int i)
 {
  Y temp=a;
  a.x++;
  b.y++;
  return temp;
 }

1、成员函数重载可能造成的麻烦:成员函数重载的运算符不具有交换性。
            原因:成员函数仅能被一个“实际对象”所调用,如果引起成员函数调用的是一个值(非一个对象),成员函数将不能正确工作。
2、可用友元函数解决这一问题:
  友元函数重载运算符时,需要明确给出参数,不会出错。
3、不能用友元函数重载的运算符:
      = 、 ( )、[]、- >
4、注意:
(1)对THIS所指向的数据的任何改变都会影响到激活运算数函数的对象。
(2)可使用引用参数(指针)来解决重载时的二义性。

重载++和--
一、关于++和- -
1、C中的++和- -的两种形式:
前缀:++i; 后缀:i--;
2、在C++中的约定 (显式地区分前缀和后缀)
(1)对于前缀方式++i:
    成员函数:XX::operator ++ ();
    友元函数:X operator ++ (X&);
(2)对于后缀方式i++:
  成员函数:XX::operator ++ (int);
    友元函数:X operator ++(X&, int);
    第二个参数INT一般设置为0,如:
 i++  等价于:i++(0)  或:i++=0
重载赋值运算符
一、概述
1、“=”赋值运算符可以被重载;
2、重载后不能被继承;
3、必须重载为成员函数。

二、格式:
X X :: operator=(const X from)
 {
   //复制X的成员;
 }

三、一般来说当缺省的类赋值函数不能正确工作时,考虑“=”的重载。

重载运算符()和[]
一、重载函数调用运算符()
1、函数为:operator();
2、格式:
 X x;
     x(arg1, arg2)  可被解释为:x. operator ()(arg1,arg2);

二、重载下标运算符[]
1、函数为:operator[];
2、格式:
 X x;
     x(y)  可被解释为:x. operator [  ](y);

三、两都者只能采用成员函数重载,不能使用友元函数。

 

 

 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值