c++ - 使成员函数成为 friend

标签 c++ operator-overloading friend

当你让一个类的成员函数成为它自己的友元时会发生什么!?

下面的代码编译并运行。如果没有 friend 声明,则会生成“操作符的太多参数”(这是正确的)。我意识到这样做没有任何意义,但谁能告诉我这里发生了什么? friend 是否以某种方式强制编译器省略默认的 this 参数?

class Test
{
public:
  friend bool operator<(Test& lhs, Test& rhs)
  {
     return true;
  }
};

int main( int c, char** argv)
{
  Test test1;
  Test test2;

  return test1 < test2;
}

最佳答案

不同之处在于,即使整个定义都出现在类中, friend 也不是成员;相反,函数被放置在周围的命名空间中。所以,没有 this指针。成员(member)期间operator<隐式操作 this和显式右侧参数,一个 friend需要显式提供作为函数参数的左侧和右侧参数 - 因此需要额外参数。你的friend版本相当于将函数放在类之后,除了它可以访问 private。和 protected成员和基地,隐含地 inline (虽然这并不意味着编译器必须内联它 - 这只是一个提示,但它对于单一定义规则很重要,因为你的 friend 函数可以从许多翻译单元中包含并且链接没有问题)。

关于c++ - 使成员函数成为 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4363318/

相关文章:

c++ - 为什么 c++11 sleep_for microseconds 实际上休眠了毫秒?

c++ - if-else 语句中的 "equal to"与 "not equal to"运算符

c++ - 如何通过代理服务器环境获取非标准服务?

c++ - 可能会使花括号过载吗?

c++ - 如何将重载函数传递给运算符(operator)?

python - Anaconda 导入错误 :/usr/lib64/libstdc++. so.6:未找到版本 `GLIBCXX_3.4.21'

C++ 运算符 << 打印对象地址

c++ - 友元函数默认模板 : Intel ICPC warning

c++ - 模板类的模板运算符需要访问其他特化

c++ - 如何在 C++ 中使用一个通用的友元函数?