C++:为什么成员函数优先于全局函数

use*_*739 8 c++ overloading

为什么在下一个程序中成员函数foo优先于全局foo,尽管全局foo匹配类型?

#include <iostream>
using namespace std;

void foo(double val) { cout << "double\n";}

class obj {
public:
  void callFoo() { foo(6.4); }
private:
  void foo(int val) {cout << "class member foo\n"; }
};

int main() { 
  obj o;
  o.callFoo();
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 9

因为foo可以在类范围中找到命名的成员函数,然后名称查找将停止,因此全局版本foo将不会被考虑用于重载解析,即使全局版本更合适.这是一种隐藏名字.

如果要调用全局版本,可以通过显式调用它::foo(6.4);.

这里是一个解决办法,使全局函数为重载决议.

非限定名称查找的参考


Dev*_*lar 7

考虑如果在代码库中某处声明的全局函数(可能有几条#include语句)会胜过在类本身class obj声明的成员函数会发生什么......

这意味着,如果你想安全地玩它,你必须完全限定每个成员函数的调用 ......

this->foo();
Run Code Online (Sandbox Code Playgroud)

...而不是必须限定实际引用全局函数的不太可能的情况.

::foo();
Run Code Online (Sandbox Code Playgroud)

这被称为"最少惊喜的概念".

  • 谢谢你接受了这个答案.但是,@ songyuanyao在技术上*更正确,并得到了进一步的参考. (2认同)