【问题标题】:function in C++: define it before use itC++ 中的函数:在使用之前定义它
【发布时间】:2012-03-21 13:12:44
【问题描述】:

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

这是我的问题,

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

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

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

上面的代码可以正常工作。但是foo 调用了bar 而我没有将bar 的定义放在foo 之前,或者转发声明bar,在foo 中调用bar 怎么可能工作?编译器如何找到bar

【问题讨论】:

    标签: c++ method-resolution-order


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      其实叫Forward reference

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

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

      【讨论】:

      • 根据您的回答,我读到,forward-reference 在 C++ 中已弃用?
      • 前向引用C++C相比的新特性。
      【解决方案3】:

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

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

      所以它只查看类结束时对bar 的调用,此时它已经看到了它的声明并且一切正常。

      【讨论】:

      • 如果我将函数的定义移出类的主体,那么类主体中的函数声明将充当forward-decl,对吗?
      • 是的。如果将它们都移出,则可以按任意顺序定义它们。
      【解决方案4】:

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

      【讨论】:

      • 如果你尝试使用一个在定义之前就属于类成员的类型,你仍然会遇到麻烦。
      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多