如果在同一个类中定义的这两个函数如何在没有前向声明的情况下相互调用?

时间:2015-01-06 10:36:33

标签: c++ function forward-declaration

我正在学习使用boost / asio进行编码。许多代码示例都使用了async_accept和bind的组合。在服务器代码中,我遇到了这样的事情:

class Tcp_server
{
public:
    Tcp_server()
    {

    }
    void start_accept(int a)
    {
        if(a>0)
        {
            cout<<a<<endl;
            handle_accept(a-1);
        }

    }

    void handle_accept(int a)
    {
        if(a>0)
        {
            cout<<a<<endl;
            start_accept(a-1);
        }

    }
};

如果我创建一个Tcp_server实例并调用handle_accept或start accept,它就可以了。但是,如果我删除Tcp_server类封装,编译器会抱怨&#34; handle_accept未声明&#34;。我只是想知道编译器是否自动转发声明在同一个类中定义的所有函数。有谁能解释为什么?

1 个答案:

答案 0 :(得分:10)

在类的定义中定义的函数具有完全相同的语义,就好像它们仅在类定义中声明,然后在类定义之后立即定义。唯一的区别是这样的成员函数是内联隐式声明的,而函数定义是非内联或显式内联。也就是说,从编译器的角度来看,声明函数并在考虑函数定义之前定义类。

在类定义之后定义函数的原因很简单:如果不这样做,则类将不完整,成员查找将失败,这对于成员函数定义显然是不可取的。作为副作用,功能可以容易地相互引用。由于在类定义中定义成员函数主要是为了方便起见,因此要求稍后使用的成员函数的声明也有些不方便。