C++运算符重载总结

有些同学对运算符重载几个小地方不明确,现在按照我对重载的研究总结一下~~~

1.对于单目运算符,建议选择成员函数;
2.对于运算符“=,(),[],->”只能作为成员函数;
3.对于运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”(双目运算符)建议重载为成员函数;
4.对于其他运算符,建议重载为友元函数。
5.成员符号(.), 范围标志(::),条件判断(?:)不能被重载
6.除赋值号以外的所有操作符函数都可以被继承。
7.在操作符函数里不能使用缺省的参数值。
8.不能把任何操作符的实现定义为静态成员函数。

9.<< >>运算符只能重载为友元函数。

一,关于class中将operator函数定义为friend主要有以下考虑: 
1.friend 函数是对外公开的,而class method是属于对象的,有些情况调用不方便 
2.对某些需要两个参数的operator function,定义friend比较方便,如下面的operator << 
3.所有class method必须有匹配的左值类型进行调用而friend则无需这样,只要能隐式转化成当前类型就可以调用该函数,因此构造函数没有定义为explicit的,可以进行隐式转化,就可以在不同类型间运算。
4.在iostream中,>>和<<本身就被定义为一个类的对象,和传统的+,-,++等都是不同的,所以在进行这两个操作符重载的时候就非常的特殊的,因为它们本身是一个类的对象,在重载了以后就必须是用友元函数来调用访问,一个类里面是可以定义另一个类的成员的,但不可能在一个类里面用操作符来实例化一个成员。所以想要对这两个操作符重载的时候也就只能用友元函数了。
注意:不光重载的输入输出流,所有class method必须有匹配的左值类型进行调用而friend则无需这样。 
5.流插入运算符(<<)、流提取运算符(>>)重载
声明之一般格式: 

ostream & operator << (ostream &,自定义类 &); //流插入重载声明

istream & operator >> (istream &,自定义类 &); //流提取重载声明

定义之一般格式:

ostream & operator << (ostream & 对象名,自定义类 & 对象名)

{对<<的重载处理} //流插入重载函数定义

istream & operator >> (istream & 对象名,自定义类 & 对象名)

{对>>的重载处理} //流提取重载函数定义
(二)关于赋值运算符
1.在我的理解c/c++赋值运算符的本意就是“返回左值的引用”(左值:赋值号左面的变量而非其值)
2.为了进行连续赋值,即 x = y = z
注意(对于a = b(a,b均为对象时),若不返回左值的引用,将会生成临时对象。如果不处理a = b = c这样的表达式,也会正常(只是会调用拷贝构造函数和析构函数处理临时对象,但有时会出现一些问题)
关于赋值运算符是否返回引用
1、赋值返回引用
x = y = z 先执行y = z,返回y的引用,执行x = y
2、赋值不返回引用
x = y = z 先执行y = z,返回用y初始化的临时对象(注意临时对象都是常对象),再执行x = y的临时对象(要求operator=(const X&) ),返回用x初始化的临时对象(此处要求拷贝构造函数必须为X(const X&) ))
【如果在类中没有说明本身的拷贝构造函数和赋值运算符,编译程序将会提供,但他们都只是对对象进行成员浅拷贝。在那些指向堆空间指针作为数据成员的类中,必须避免使用浅拷贝,而要为类定义自己的赋值运算符,以给对象分配堆内存。】
3.int friend operator = (int a, integer b);这样重载之后,语句2 = a; 表述也是正确的,但是却是明显的语法错误,缺少左值!为了避免此类错误,需要将赋值操作符重载为成员函数
总结:也就是说重载操作符为成员函数的时候左操作数必须是类的类型,而友员函数可以任意调换顺序。
(三)关于双目运算符
重载双目运算符可以用友元或者成员函数,但是两者有区别
例:如用成员函数重载了 + 之后(还用上面(二)的例子,但此时赋值运算符 = 已经被重载为成员函数)
a = a + 1;是被支持的,而a = 1 + a;就是不被允许的
这种情况下就要使用友元函数来对运算符重载以避免不必要的麻烦
总结:也就是说重载操作符为成员函数的时候左操作数必须是类的类型,而友员函数可以任意调换顺序。用专业术语说就是如果选择类成员函数,则限定了运算符左边的数据类型只能是当前类数据类型,当选择友元时可以拓展数据类型的范围。
(四)关于++,--的重载
1,作为前缀时,操作符首先改变操作数的值,然后再把结果返回,函数实际返回的是一个当前对象的引用;
2,作为后缀时,函数返回的是对象原始值的拷贝。其参数的缺省类型是int型,如果没有对它赋值,则它的值设为0。这样做的唯一目的是为了区别不同的函数定义。
(五)关于[]的重载
当类内有数组类数据类型时,用operator[int index]可以返回数组元素。函数应该返回引用,从而使下标可以出现再赋值号的任意一侧。
(六)关于()的重载
这个操作符的用途是使类的对象可以象函数名称一样使用。用户可以用多个定义对此操作符进行重载。
(七)其余的重载运算符在教材上有很明确的语句规则,有什么不明白随时@我~~~

原文链接: https://www.cnblogs.com/yeanzhi/archive/2013/06/06/3121520.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++运算符重载总结

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/91350

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午1:08
下一篇 2023年2月10日 上午1:08

相关推荐