在同一个 class 中定义的这两个函数如何在没有前向声明的情况下相互调用?
How do these two functions defined in the same class manage to call each other without forward declaration?
目前我正在使用 boost/asio 学习编码。许多代码示例使用 async_accept 和绑定的组合。在服务器代码中,我遇到了这样的事情:
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 或开始接受,它就可以工作。但是如果我放弃 Tcp_server class 封装,编译器会报错 "handle_accept is not declared"。我只是想知道编译器是否自动转发声明在同一 class 中定义的所有函数。谁能解释为什么?
在 class 定义中定义的函数具有完全相同的语义,就好像它们仅在 class 定义中声明然后在 class 定义之后立即定义一样。唯一的区别是此类成员函数是隐式声明为内联的,而函数定义是非内联或显式内联的。也就是说,从编译器的角度来看,在考虑函数定义之前先声明函数并定义 class。
在 class 定义之后定义函数的原因很简单:如果不这样做,class 将不完整并且查找成员将失败,这显然不是成员希望的函数定义。作为副作用,函数可以很容易地相互引用。由于在 class 定义中定义成员函数主要是为了方便,因此要求为以后使用的成员函数声明也会有些不便。
目前我正在使用 boost/asio 学习编码。许多代码示例使用 async_accept 和绑定的组合。在服务器代码中,我遇到了这样的事情:
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 或开始接受,它就可以工作。但是如果我放弃 Tcp_server class 封装,编译器会报错 "handle_accept is not declared"。我只是想知道编译器是否自动转发声明在同一 class 中定义的所有函数。谁能解释为什么?
在 class 定义中定义的函数具有完全相同的语义,就好像它们仅在 class 定义中声明然后在 class 定义之后立即定义一样。唯一的区别是此类成员函数是隐式声明为内联的,而函数定义是非内联或显式内联的。也就是说,从编译器的角度来看,在考虑函数定义之前先声明函数并定义 class。
在 class 定义之后定义函数的原因很简单:如果不这样做,class 将不完整并且查找成员将失败,这显然不是成员希望的函数定义。作为副作用,函数可以很容易地相互引用。由于在 class 定义中定义成员函数主要是为了方便,因此要求为以后使用的成员函数声明也会有些不便。