为什么我不必在类中声明函数或变量?
Why do I not have to forward declare functions or variables inside classes?
原文如下
所以,我们发现下面的代码不能工作:
void f(){
g();
}
void g(){}
但是,它确实在类中工作,这就是我困惑的地方:
class test{
int getY(){
return getX();
}
int getX(){
return 10;
}
}
在MSVC10.0下可以很好地编译。
Ideone链接。
所以,在改写之后,问题是:
为什么在类中不需要前向声明?
原来的问题,请忽略
在c++中,函数或变量的声明顺序完全无关紧要。调用尚未声明的函数没有任何问题。这同样适用于变量:
但是,它不适用于类。如果我想使用稍后在源文件中定义的类,我必须转发声明它。
为什么?是什么阻止编译器知道所有的类声明?
在c++中,函数或变量的声明顺序是不确定的一点也不重要。调用函数并没有错尚未申报。对于变量也是如此。
…这不是真的吗?您需要在使用函数和变量之前声明它们,否则编译器将对您不太满意。
EDIT作为对编辑的响应,您所显示的是一个非常特殊的情况,其中涉及的所有内容都是类的内部。在这种特殊情况下,可以使用未声明的变量名和函数名。您可以这样做的唯一原因是因为编译器将类定义视为一个单元,并在编译前通读所有的类定义。但是,一般来说,您必须转发声明所有内容。
一般来说,每个名称都必须在使用前声明,无论它们是命名类、函数、变量还是其他什么。
然而,有一种特殊情况:在(大部分)类定义中,即使尚未声明,也可以使用该类成员的名称。您添加的示例演示了这一点,并且如果未声明的名称是类,变量或其他任何东西,只要它是test
的成员,它仍然可以工作。
类的前向声明类似于指定函数的原型。
通过这种方式,你可以指定类名而不提及它的内容,类似于函数原型,你可以在指定定义之前指定函数签名来声明它的作用域。定义可以在特定代码段之后完成。
是的,这里有一个例外,即成员包含在类或结构中。
相关文章:
- 未使用的C++未优化的静态成员函数/变量
- 内联函数/变量的外部链接
- 同一函数中的静态函数变量初始化顺序
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 如何在LUA C API中分配全局LUA函数变量
- 如何将函数变量传递给C lambda函数
- 通过另一个C++函数更改函数变量
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- C++:静态成员不能在声明时定义,但静态函数变量可以?
- apache-frift是否支持函数变量作为参数
- 类函数/变量在使用之前必须声明
- 函数变量去哪里
- 无法使用函数变量?错误表达式必须具有类类型
- 如何在main中使用函数变量
- 每当尝试打印函数变量时,C++ cout 错误
- 是否存在查看成员函数/变量的整洁等效项
- 访问友元类之间的函数变量
- 函数到函数变量
- 一个定义规则是否强制创建一个静态函数变量