- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 friend
关键字重载运算符和作为类内的成员函数有什么区别?
此外,任何一元运算符重载(即作为友元函数与作为成员函数)有什么区别?
最佳答案
Jacob 是正确的……在类中声明的 friend
函数可以访问该类,但它根本不在类中,其他所有人都可以访问它。
对于不是类成员的运算符重载(也称为自由函数,它可能是友元,也可能不是),参数与操作数相同。对于属于某个类的成员,第一个操作数是“隐式参数”,它变成了 this
。
隐式参数在几个方面不同于自由函数的第一个参数:
virtual
重载将由第一个操作数的动态类型选择,这对于没有额外代码的自由函数是不可能的。)一元、二元或 n 元的情况相同(在 operator()
的情况下)。
Members privilege of mutation: 改变第一个操作数的操作符(例如+=
, =
, prefix ++
) 应该作为成员函数来实现,并且应该专门实现所有重载的内容。后缀++
是二等公民;它被实现为 Obj ret = *this;++ 这个;返回 ret;
。请注意,这有时会扩展到复制构造函数,其中可能包含 *this = initializer
。
自由规则:只有可交换运算符(例如/
)应该是自由函数;所有其他运算符(例如一元运算符)都应该是成员。交换运算符本质上会复制对象;它们被实现为 Obj ret = lhs; ret @= rhs; return ret;
其中 @
是交换运算符,lhs
和 rhs
是左侧和右侧参数,分别。
C++ 友元的黄金法则:避免友元。 friend
污染了设计的语义。 重载推论:如果您遵循上述规则,重载很简单,那么 friend
是无害的。 friend
样板重载定义允许将它们放在 class {
大括号内。
请注意,某些运算符不能是自由函数:=
、->
、[]
和 ()
,因为标准在第 13.5 节中特别说明了这一点。我认为仅此而已……我认为一元 &
和 *
也是,但我显然错了。不过,他们应该总是作为成员重载,而且只有在仔细考虑之后!
关于c++ - 运算符重载(友元函数和成员函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770745/
我是一名优秀的程序员,十分优秀!