0

以下代码编译时没有任何警告或错误:

#include <iostream>
using namespace std;
class demo_class
{
    int x;
    float y;
    public:
    void fun(void);
};
void fun2(void)
{
    cout<<"i am fun2\n";
}
void demo_class::fun(void)
{
    cout<<"i am fun\n";
    cout<<"i can call fun2\n";
    fun2();
}
int main()
{
    demo_class ob1;
    ob1.fun();
    return 0;
}

我不明白由于 fun 函数的范围仅在 demo_class 中,那么它如何调用 fun2 函数,它不应该显示错误作为仅在 demo_class 内访问 fun 函数吗?

4

2 回答 2

2

名称查找将尝试检查所有可能的范围,直到在任何范围内找到至少一个,然后名称查找停止。

在这种情况下,fun2在类范围内找不到名称,然后检查并::fun2找到更进一步的范围,即全局范围。

于 2019-06-11T08:38:14.377 回答
1

没有理由禁止从成员函数中调用自由函数。如果是这种情况,类将毫无用处(它们将是一种防止代码重用而不是支持它的方法)。

正如评论中提到的,在 cout<<"i am fun2\n";您调用非成员函数时,调用fun与此没有太大区别。

此外,您的示例与一粒盐没有太大区别

#include <iostream>
using namespace std;
class demo_class
{

};
void fun2(void)
{
    cout<<"i am fun2\n";
}
void fun3(demo_class& dc)
{
    cout<<"i am fun\n";
    cout<<"i can call fun2\n";
    fun2();
}
int main()
{
    demo_class ob1;
    fun3(ob1);
    return 0;
}

成员函数总是可以转换为自由函数。如果fun要访问私有成员,我们必须将其声明为friend使上述工作正常进行,否则在这里没有问题。

您也可以在自由函数中执行相反的操作并调用成员函数,如

 struct foo {
     void bar(){}
 };

 void func(foo& f) { 
      f.bar();
 }

 int main() {
     foo f;
     func(f);
 }
于 2019-06-11T08:46:09.207 回答