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

spi*_*way 12 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);
        }

    }
};
Run Code Online (Sandbox Code Playgroud)

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

Die*_*ühl 10

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

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

  • @Drop这个决定的原因是,如果标准是在声明与定义结合的情况下要求前向声明,那么在类中定义函数将变得非常不方便,直到可以完全停止使用该特性. (2认同)