第14章 重载操作符与转换

14.1、重载操作符的定义

         不能重载的操作符:“::”、“.*”、“.”、“?:”。

         重载操作符必须具有至少一个类类型或枚举类型的操作数(强制重载操作符不能重新定义用于内置类型对象的操作符的含义)。

         对于重载操作符,优先级和结合性还是固定的,并且对于&&、||这些不再具备短路求值特性。

         作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数

         使用重载符可以这样:a1.operator+=(a2);来调用,或者a1+=a2;

14.2、输入和输出操作符

14.2.1、输出操作符<<的重载

         如ostream& operator<<(ostream& os, const A&a){}。ostream为非const,因为写入到流会改变流的状态。IO操作符必须为非成员函数,否则左操作数将只能是该类类型的对象。

14.2.2、输入操作符>>的重载

         输入操作符必须处理错误和文件结束的可能性。

14.3、算术操作符和关系操作符

         算术和关系操作符一般为非成员函数。加法返回一个右值,而不是一个引用。如:Aoperator+(const A&,const A&);而成员函数重载的+=为:A&A::operator+=(const A&);

         相等操作符,如inlinebool operator==(const A &a,const A &b){}

14.4、赋值操作符

         赋值操作符必须定义为成员函数,必须返回对*this的引用。

14.5、下标操作符

         下标操作符必须定义为类成员函数。如int & A::operator[] (const size_t index){return 下标元素}。

14.6、成员访问操作符

         重载成员访问符,如:解引用:const A &operator*() const{return *ptr->a;}先->再*。箭头操作:A*operator->() {return ptr->a;}

         箭头操作符不接受显示形参。

         point->action();相当于(point->cation)();point->action与point.operator->()->action相同,point.operator->()返回相应的类,再由返回类来执行action。重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。

14.7、自增操作符和自减操作符

         前自增:A& A::operator++(){if(到达末尾){抛出越界异常;}指向相应的++;return*this;}前自减也类似。

         后缀式操作符函数接受一个额外的int型形参(作用只是用于区分),如A A::operator++(int){Aa(*this); ++*this; return a;}。注:这边不是返回引用,应返回旧值,所以要值返回。

         a.operator++(0)调用后置,没0调用前置。

14.8、调用操作符和函数对象

         定义了调用操作符的类,其对象常称为函数对象。如struct A{int operator()(intval){return val<0?-val:val;}};,下次调用A a;a(i)就是返回i的绝对值。

14.8.2、标准库定义的函数对象

         标准库定义了一组算术、关系与逻辑函数对象类,定义在functional头文件中。

14.9、转换与类类型

         转换操作符:如operatorint() const {return int成员;},转换函数采用如下形式,operatortype();tpye表示内置类型、类类型名或由类型别名所定义的名字。转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空。有了该转换函数,在用到int的地方,可以将该类对象转换成int。

         类类型转换之后不能再跟另一个类类型转换,多个转换代码将出错。

         给一个类与两个内置类型之间的转换不是好的做法,如分别将类A与int和double关联,此时,如果传递long型,将具有二义性,从而出错。避免二义性最好的做法就是避免编写互相提供隐式转换的成对的类即使一个调用需要在类类型转换之后跟一个标准转换,而另一个是完全匹配,编译器仍会将该调用标记为错误(VS貌似可以···调用的是完全匹配的)。

         既为算术类型提供转换函数,又为同一类类型提供重载操作符,可能导致二义性,如A a;int i = a+0;这时0可以转换成A类,用A类的+操作,也可以是a转换成int···
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值