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

时间:2014-06-09 14:51:23

标签: c++ function class variables c++11

原始问题可以在下面找到。

因此,我们发现以下内容并不起作用:

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

但是,确实在课堂上工作,这就是我困惑的地方:

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

在MSVC10.0下编译完全正常。

Ideone link. It does work.

因此,在重新措辞之后,问题是:

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

原始问题,请忽略

在C ++中,声明函数或变量的顺序根本不重要。调用尚未声明的函数没有任何问题。这同样适用于变量:

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

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

3 个答案:

答案 0 :(得分:6)

  

在C ++中,声明函数或变量的顺序   没关系。调用函数没有错   尚未宣布。这同样适用于变量。

......那根本不是真的吗?你需要在使用之前声明函数和变量,否则编译器会对你不满意。

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

答案 1 :(得分:2)

通常,每个名称必须在使用前声明,无论它们是类,函数,变量还是其他名称。

但是,有一个特殊情况:在(大多数)类定义中,您可以使用该类成员的名称,即使它们尚未声明。您添加的示例演示了这一点,并且如果未声明的名称属于类,变量或其他任何名称,它仍然有效,只要它是test的成员。

答案 2 :(得分:0)

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

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

是的,有一个例外,即成员包括在类或结构中。这些成员具有相同的范围。