3

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

这是我的问题,

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

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

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

上面的代码可以正常工作。但是foo调用bar并且我没有在bar' 之前foo或 forward-declare之前放置定义bar,调用barin怎么会foo起作用?编译器怎么能找到bar

4

4 回答 4

5

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

实际发生的情况是编译器一直等到类定义结束(实际上是最外面的封闭类定义的结束),然后再尝试分析内联函数的主体。

所以它只查看bar类结束时的调用,到那时它已经看到了它的声明并且一切都很好。

于 2012-03-03T04:19:45.050 回答
3

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

这就是为什么成员函数可以在其定义中引用它所属的类的其他成员,而不管它在类定义中的什么位置定义。

于 2012-03-03T04:16:47.130 回答
3

实际上,它被称为Forward reference

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

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

于 2012-03-03T04:18:57.470 回答
1

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

于 2012-03-03T04:19:55.953 回答