在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
?
答案 0 :(得分:5)
语言说成员函数声明的范围是整个类(松散地),所以这很好。
实际发生的是,在尝试分析内联函数的主体之前,编译器一直等到类定义的结尾(实际上,最外层的封闭类定义的结尾)。
所以它只查看课程结束时对bar
的调用,到那时它已经看到了它的声明,一切都很顺利。
答案 1 :(得分:3)
在类定义中定义的成员函数的主体是一种特殊情况:为了进行名称查找,就好像在类定义结束后立即定义了成员函数。
这就是为什么成员函数可以在其定义中引用它所属的类的其他成员,无论它在类定义中的哪个定义。
答案 2 :(得分:3)
实际上,它被称为Forward reference
术语前向引用有时用作前向声明的同义词。但是,在任何声明之前,更多时候是指实体的实际使用;也就是说,上面代码中对第二个的第一个引用是前向引用。因此,我们可以说因为前向声明在Pascal中是强制性的,所以禁止前向引用。
允许转发引用会大大增加编译器的复杂性和内存要求,并且通常会阻止编译器一次性实现。
答案 3 :(得分:1)
当你谈论一个类中的定义(而不是全局范围)时,这是一个不同的交易。我相信这是通过编译器先通过类定义来实现的,然后查看所有方法的实际实现。总而言之,在这种情况下,您无需担心任何类型的前向声明/引用。