我在标题中看到我没有给自己写以下内容:
class MonitorObjectString: public MonitorObject {
// some other declarations
friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) { return(lhs.fVal==rhs.fVal); }
我不明白为什么这个方法被声明为 friend 。我认为如果函数在另一个地方定义并且需要访问类的内部成员是有意义的,但这里不是这种情况,因为它是内联的,甚至不需要访问成员。
你怎么看? “ friend ”没用吗?
最佳答案
friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) {
return(lhs.fVal==rhs.fVal);
}
有时称为 friend definition
,因为它是一个定义函数的友元声明。它将函数定义为围绕它出现的类的命名空间的非成员函数。实际上,内联是多余的:如果它是友元定义,则隐式声明内联。它的一些优点和缺点:MonitorObjectString
的内部.但这既不好也不坏。这取决于实际情况。例如,如果有函数 getFVal()
让函数成为 friend 是毫无意义的。可以使用getFVal
以及然后。 我曾经喜欢这种操作符的 friend 定义风格,因为它们可以直接访问类成员,并且出现在类定义中——所以我可以“一目了然”。然而,最近我得出的结论是,这并不总是一个好主意。如果您可以(并且应该)纯粹使用类的公共(public)成员函数来实现该运算符,则应该将其设为非友元(和非成员)运算符,定义在该类的同一命名空间中。它确保如果您更改某些实现 - 但保持类的接口(interface)相同 - 运算符仍然可以工作并且您的级联更改更少,因为您知道它无法访问实现细节。
但是,我更喜欢这种风格而不是编写成员运算符,因为命名空间范围内的运算符函数具有与参数对称的附加特性:它们不会将左侧特殊对待,因为两侧只是普通参数而不是对象参数绑定(bind)到
*this
.如果左侧或右侧属于您的类的类型,则可以隐式转换另一侧 - 无论它是左侧还是右侧。对于同样在没有友元定义语法的情况下定义的函数(传统上,在命名空间范围内),您将具有选择性地包含使这些运算符可用或不可用的 header 的功能。
关于c++ - friend 和内联方法,有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534079/