C ++中的函数:在使用之前定义它

时间:2012-03-03 04:09:59

标签: c++ method-resolution-order

在C / C ++中,当且仅当被调用函数对调用者可见时,调用函数才能调用被调用函数,这意味着被调用者的定义应该在它被使用之前完成,否则使用forward-declaration。

这是我的问题,

class A
{
    public:
        void foo()
        {
            bar();
        }

        void bar()
        {
            //...
        }
};

int main()
{
    A a;
    a.foo();
}

上面的代码可以正常工作。但是foo调用bar并且我没有在bar或前向声明foo之前提出bar的定义,如何调用{{1}在bar工作?编译器如何找到foo

4 个答案:

答案 0 :(得分:5)

语言说成员函数声明的范围是整个类(松散地),所以这很好。

实际发生的是,在尝试分析内联函数的主体之前,编译器一直等到类定义的结尾(实际上,最外层的封闭类定义的结尾)。

所以它只查看课程结束时对bar的调用,到那时它已经看到了它的声明,一切都很顺利。

答案 1 :(得分:3)

在类定义中定义的成员函数的主体是一种特殊情况:为了进行名称查找,就好像在类定义结束后立即定义了成员函数。

这就是为什么成员函数可以在其定义中引用它所属的类的其他成员,无论它在类定义中的哪个定义。

答案 2 :(得分:3)

实际上,它被称为Forward reference

  
    

术语前向引用有时用作前向声明的同义词。但是,在任何声明之前,更多时候是指实体的实际使用;也就是说,上面代码中对第二个的第一个引用是前向引用。因此,我们可以说因为前向声明在Pascal中是强制性的,所以禁止前向引用。

         

允许转发引用会大大增加编译器的复杂性和内存要求,并且通常会阻止编译器一次性实现。

  

答案 3 :(得分:1)

当你谈论一个类中的定义(而不是全局范围)时,这是一个不同的交易。我相信这是通过编译器先通过类定义来实现的,然后查看所有方法的实际实现。总而言之,在这种情况下,您无需担心任何类型的前向声明/引用。