c – 运算符重载(朋友和成员函数)

前端之家收集整理的这篇文章主要介绍了c – 运算符重载(朋友和成员函数)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用friend关键字的操作符重载和类中的成员函数有什么区别?

而且,一元运算符重载(即作为一个朋友而不是一个成员函数)的情况有什么区别?

解决方法

Jacob是正确的…在类中声明的一个朋友的功能可以访问该类,但它不在类的内部,而其他人都可以访问它.

对于不是类的成员的操作符重载(也称为空闲函数,它可能是一个朋友,或者可能不是),参数与操作数相同.对于一个类的成员,第一个操作数是“隐含参数”,这就是这个.

隐含的参数与以下几种方式的自由函数的第一个参数不同:

>它的类型是reference-to-class,而free函数可以为其第一个参数声明任何类型.
>它不参与隐式类型转换. (它不会被转换构造函数初始化).
>它确实参与虚拟覆盖解析. (虚拟过载将由第一个操作数的动态类型选择,而不带额外代码的自由函数是不可能的).

对于一元,二进制或n-ary(对于operator()),情况是相同的.

成员特权突变:改变第一个操作数(例如=,=,前缀)的操作符应作为成员函数实现,并且应该专门实现所有重载的内容. Postfix是二等公民;它被实现为Obj ret = * this;这个;返回.请注意,这有时扩展到复制构造函数,它可能包含* this = initializer.

通勤者自由:只有交换操作符(如/)应该是自由职能;所有其他操作符(如一元任何东西)都应该是会员.交换运算符固有地制作对象的副本;它们被实现为Obj ret = lhs; ret @ = rhs;返回其中@是交换运算符,lhs和rhs分别是左侧和右侧参数.

C友谊的金色规则:避免友谊.朋友污染了设计的语义.重载推论:如果您遵循上述规则,重载过程很简单,那么朋友是无害的.有趣的样板重载定义允许将它们放在类{括号中.

请注意,一些运算符不能是免费函数:=,– > []和(),因为标准在第13.5节中具体说明了这一点.我认为这一切都是…我想到一元&和*也是,但我显然是错误的.他们应该永远作为成员超载,但只有仔细思考!

原文链接:https://www.f2er.com/c/112215.html

猜你在找的C&C++相关文章