为什么我不必在类中声明函数或变量?

Why do I not have to forward declare functions or variables inside classes?

本文关键字:函数 变量 声明 不必 为什么      更新时间:2023-10-16

原文如下

所以,我们发现下面的代码不能工作:

void f(){
    g();
}
void g(){}

但是,它确实在类中工作,这就是我困惑的地方:

class test{
   int getY(){
       return getX();
   }
   int getX(){
       return 10;
   }
}

在MSVC10.0下可以很好地编译。

Ideone链接。

所以,在改写之后,问题是:

为什么在类中不需要前向声明?

原来的问题,请忽略

在c++中,函数或变量的声明顺序完全无关紧要。调用尚未声明的函数没有任何问题。这同样适用于变量:

但是,它不适用于类。如果我想使用稍后在源文件中定义的类,我必须转发声明它。

为什么?是什么阻止编译器知道所有的类声明?

在c++中,函数或变量的声明顺序是不确定的一点也不重要。调用函数并没有错尚未申报。对于变量也是如此。

…这不是真的吗?您需要在使用函数和变量之前声明它们,否则编译器将对您不太满意。

EDIT作为对编辑的响应,您所显示的是一个非常特殊的情况,其中涉及的所有内容都是类的内部。在这种特殊情况下,可以使用未声明的变量名和函数名。您可以这样做的唯一原因是因为编译器将类定义视为一个单元,并在编译前通读所有的类定义。但是,一般来说,您必须转发声明所有内容。

一般来说,每个名称都必须在使用前声明,无论它们是命名类、函数、变量还是其他什么。

然而,有一种特殊情况:在(大部分)类定义中,即使尚未声明,也可以使用该类成员的名称。您添加的示例演示了这一点,并且如果未声明的名称是类,变量或其他任何东西,只要它是test的成员,它仍然可以工作。

类的前向声明类似于指定函数的原型。

通过这种方式,你可以指定类名而不提及它的内容,类似于函数原型,你可以在指定定义之前指定函数签名来声明它的作用域。定义可以在特定代码段之后完成。

是的,这里有一个例外,即成员包含在类或结构中。