重载操作符

  1. 重载操作符1.1 限制重载操作符具有以下限制:
  (1) 只有C++预定义的操作符集中的操作符才可以被重载;
  (2) 对于内置类型的操作符,它的预定义不能被改变,应不能为内置类型重载操作符,如,不能改变int型的操作符+的含义;
  (3) 也不能为内置的数据类型定义其它的操作符;
  (4) 只能重载类类型或枚举类型的操作符;
  (5) 重载操作符不能改变它们的操作符优先级;
  (6) 重载操作符不能改变操作数的个数;
  (7) 除了对( )操作符外,对其他重载操作符提供缺省实参都是非法的;
  1.2 注意点(1) 后果载操操作符首先要确定它的返回值是左值,还是右值,如果是左值最返回引用,如果是右值那就直接返回值;
  (2) +号等这样的操作符没有对象可以容纳改变后值,对于这样的情况最好返回数值,否则只能要操作符体内创建临时对象用于容纳改变后的值,如果在堆中创建临时对象返回指针或者引用,在操作符函数体外还需要释放它,如果返回的对象而不是引用或者指针,那么效率是比较低的。如果返回的是数值,最好在该类的构造函数中增加对该类型数值的转换函数,如:返回值是int类型,那么最好有一个int类型作为参数的构造函数。
  (3) 在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回,示例:
  class Test
  {
   public:
   Test(x=3){ m_value = x}
   Test &operator ++(); //前增量
   Test &operator ++(int);//后增量
  private:
   Int m_value:
  };
  Test &Test::operator ++()
  {
   m_value ++; //先增量
   return *this; //返回当前对象
  }
  Test Test::operator ++(int)
  {
   Test tmp(*this); //创建临时对象
   m_value ++; //再增量
   return temp; //返回临时对象
  }
  (4) 因为强制转换是针对基本数据类型的,所以对类类型的转换需自定义;
  (5) 转换运行符重载声明形式:operator 类型名();它没有返回类型,因为类型名就代表了它的返回类型,所以返回类型显得多余。
  (6) 一般来说,转换运算符与转换构造函数(即带一个参数的构造函数)是互逆的,如有了构造函数Test(int),那么最好有一个转换运算符int()。这样就不必提供对象参数重载运算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重载+号操作符了,因为对于a1+a2的运算,系统可能会先找有没有定义针对Test的+号操作符,如果没有,它就会找有没有针对Test类转换函数参数类型的+号操作符(因为可以将+号运行结果的类型通过转换函数转换为Test对象),因为Test类有个int类型的参数,对于int类型有+操作符,所以a1+a2真正执行的是Test(int(a1) + int(a2));即Test(3);
  (7) 对于转换运算符,还有一个需要注意的地方就是,如果A类中有以B为参数的转换函数(构造函数),那B中不能有A的转换运算符,不然就存在转换的二义性,如:
  class A{A(B&){…}}; class B{ operator A(){…}};那么以下语句就会有问题:
  B b; A(b);//A(b)有就可能是A的构造函数,也可以是B的转换运算符

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值