运算符重载:成员函数与非成员函数
在运算符重载中,成员函数和非成员函数之间的选择会引起混乱。虽然成员函数是不对称的,非成员函数是对称的,但为什么在某些情况下会首选友元函数?
成员函数只能接受一个显式参数,因为 this 指针会自动传递来表示调用对象。这种不对称性限制了与在左操作数上调用成员函数的情况的比较。但是,当左操作数不是类类型时,例如尝试将 double 与 Sample 对象进行比较,此方法会失败。
为了解决此限制,可以使用友元函数来重载运算符。友元函数可以访问类的私有成员,允许它们处理运算符重载而不受不对称限制。当使用友元函数时,编译器会将 10.0 s2 这样的表达式转换为运算符 (10.0, s2)。
STL 算法更喜欢对称版本,因为它们支持双向比较,无需在操作数中显式排序。但是,应尽可能使用非成员函数以增强封装性,因为友元函数允许访问私有成员。
总之,成员函数用于始终将类实例作为左操作数涉及的运算符,而友元函数处理类实例可以是任一操作数的情况。为了获得更大的灵活性和封装性,在不访问私有成员时应首选非成员函数。
以上是会员与非会员运算符重载:何时首选友元函数?的详细内容。更多信息请关注PHP中文网其他相关文章!