为什么我们可以从c ++中的成员函数访问non_member函数

时间:2019-06-11 08:34:42

标签: c++ class scope member-functions non-member-functions

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

#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函数了?

2 个答案:

答案 0 :(得分:1)

Name lookup将尝试检查所有可能的作用域,直到在任何作用域中至少找到一个,然后停止名称查找。

在这种情况下,无法在类范围内找到名称fun2,然后再检查进一步的范围,即globle范围,并找到::fun2

答案 1 :(得分:0)

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

如评论中所述,在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);
 }