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

标签 c++ methods inline friend

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

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/60534079/

    相关文章:

    css - 响应式 CSS 样式即时内联

    javascript - 获取 "window"对象进行评估,并列出所有变量? Javascript 评估内联 html

    c++ - 内联函数的前向声明

    Java - 如何为方法提供数组

    java - 我将不同的类放在 ArrayList 中,我想访问我的类的方法

    java - 多个按钮的onClick函数

    c++ - .wav C++ 数据未正确输出

    c++ - 非友元、非成员函数增加封装?

    c++ - gtkmm3 示例未编译(未定义引用)

    c++ - 是否可以根据 lambda 采用的参数数量专门化采用 lambda 表达式的模板函数?