gpt4 book ai didi

c++ - 运算符重载(友元函数和成员函数)

转载 作者:可可西里 更新时间:2023-11-01 16:30:01 28 4
gpt4 key购买 nike

使用 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; 其中 @ 是交换运算符,lhsrhs 是左侧和右侧参数,分别。

C++ 友元的黄金法则:避免友元。 friend 污染了设计的语义。 重载推论:如果您遵循上述规则,重载很简单,那么 friend 是无害的。 friend 样板重载定义允许将它们放在 class { 大括号内。

请注意,某些运算符不能是自由函数:=->[](),因为标准在第 13.5 节中特别说明了这一点。我认为仅此而已……我认为一元 &* 也是,但我显然错了。不过,他们应该总是作为成员重载,而且只有在仔细考虑之后!

关于c++ - 运算符重载(友元函数和成员函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770745/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com