C++中的重载运算

重载运算

当运算符被应用于类类型的对象时,C++语言允许我们为其指定新的含义,重新定义该运算符的含义。

基本概念

1)重载运算符本质上还是一个函数。因此也有函数相应的各种元素结构。
函数名:由关键字operator 和对应的运算符组成。
参数:参数数量和运算符作用的运算符对象个数一样多, 成员运算符函数的左侧运算对象隐式地绑定到this上
2)可以重载大多数但并不是全部大运算符。不能重载的运算符有:( ::     .*    .    ? :  )。
3)只能重载已有的运算符,不能发明新的运算符。
4)对于一个运算符函数来说,它要么是类的成员,要么至少含有一个类类型参数。
5)通常情况下,不应该重载逗号、取址、逻辑与、逻辑或这几种运算符。
6)在定义重载运算符时,应尽量使用与内置类型一致的含义。
7)对于将运算符作为成员还是非成员函数,可以考虑一下几方面:a)赋值、下标、调用、成员访问箭头运算符必须是成员;b)复合赋值运算符一般作为成员,但非必须;c)改变运算对象状态的运算符或者和给定类型密切相关的运算符,通常应该是成员;d)具有对称性的运算符可能转换任意一端的运算对象,通常为非成员。

输入输出运算符

1)输入输出运算符必须是非成员函数。
2)通常情况下,输出运算符的第一个形参是一个非常量ostream对象的引用,第二个形参一般是一个常量的引用。
3)通常情况下,输入运算符的第一个形参是将要读取流的引用,第二个形参是将要读入到的对象的引用;输入运算符需要有处理输入失败的情况。


算术运算符

通常情况下将算术运算符定义成非成员能函数,允许左侧或者右侧运算对象进行转换,形参通常是常量的引用。


关系运算符

1)通常情况下将关系运算符定义成非成员能函数,允许左侧或者右侧运算对象进行转换,形参通常是常量的引用。
2)对于相等运算符,只有类类型中的所有数据成员都相等才认为两个对象相等。
3)通常关系运算符应该:a) 定义顺序关系,令其与关联容器中对关键字的要求一致;b)如果类同时也含有==运算符,则定义一种关系令其与==保持一致。


赋值运算符

1)不论形参的类型是什么嘛,赋值运算符都必须定义为成员函数。
2)复合赋值运算符尽量定义成成员函数,为了与内置类型的复合赋值保持一直,通常返回类型为左侧运算对象的引用。

下标运算符

1)下标运算符必须是成员函数。
2)下标运算符返回的对象通常是所访问元素的引用,可以放在赋值运算符的任何一端,因此最好定义常量和非常量版本的两种下标运算符。

递增和递减运算符

1)建议将这两种运算符定义为成员函数。
2)为和内置类型一致,最好定义前置版本和后置版本两种运算符。








你可能感兴趣的:(C++,重载,运算符)