gpt4 book ai didi

c++ - friend 和内联方法,有什么意义?

转载 作者:IT老高 更新时间:2023-10-28 22:16:06 27 4
gpt4 key购买 nike

我在标题中看到我没有给自己写以下内容:

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 的隐式转换来调用它的能力(因为如果在查找要调用的候选对象时两种参数类型不匹配,则依赖于参数的查找将找不到该函数)。
  • 名称的查找始于友元定义所在的类的范围。这意味着不需要写出长类型名称或其他名称。只需像在类的普通成员函数中那样引用它们即可。
  • 因为它是一个 friend ,所以该函数可以看到 MonitorObjectString 的内部。但这既不好也不坏。这取决于实际情况。例如,如果有函数 getFVal() 使函数成为 friend 是毫无意义的。也可以使用 getFVal

我曾经喜欢这种 friend 定义风格的运算符,因为它们可以直接访问类成员,并且出现在类定义中——所以我可以“一目了然”。然而,最近我得出的结论是,这并不总是一个好主意。如果您可以(并且应该)纯粹使用类的公共(public)成员函数来实现运算符,则应该将其设为非友元(和非成员)运算符,定义在类的同一命名空间中。它确保如果您更改某些实现 - 但保持类的接口(interface)相同 - 运算符仍然可以工作,并且您的级联更改更少,因为您知道它无法访问实现细节。

然而,我更喜欢这种风格而不是编写成员运算符,因为命名空间范围内的运算符函数具有与参数对称的附加特性:它们不会将左侧特殊对待,因为两者边只是普通参数,而不是绑定(bind)到 *this 的对象参数。如果左侧或右侧属于您的类的类型,则可以隐式转换另一侧 - 无论它是左侧还是右侧。对于也没有使用友元定义语法定义的函数(传统上,在命名空间范围内),您将具有选择性地包含使这些运算符可用或不可用的 header 的功能。

关于c++ - friend 和内联方法,有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/381164/

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