在类中声明的静态变量,其类型与类的类型相同

nit*_*712 -2 c++ java static class

我知道为什么这是C++中的错误.

class A
{
     A b;
};
int main() {}
Run Code Online (Sandbox Code Playgroud)

因为type of b is unresolved at the compile time.那么为什么下面的代码是正确的?

class A
{
     static A b;
}
int main() {}
Run Code Online (Sandbox Code Playgroud)

如果它是静态的,变量b的类型是否已被解析?

最后,令我惊讶的是以下代码适用于JAVA:

public class Main
{
Main g;
public static void main(String[] args)
{
    System.out.println("hi");
}
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我知道它们特定于类而不是实例的静态变量.但这并没有给出上述问题的答案......请给我一些启示.

Mik*_*our 6

因为 b 的类型在编译时未解析。

不,这是因为类型b不完整的,在这一点上。您可以声明一个不完整类型的变量,但不能定义一个。定义分配空间来存储对象,为此必须知道对象的大小。

静态成员声明只是一个声明;如果使用该变量,则必须在其他地方定义该变量。所以在类中声明是可以的。

非静态成员声明也是一个定义;它为类中的变量分配空间,为此类型必须是完整的。(此外,非空对象在逻辑上不可能包含相同类型的对象)。

Java 没有不完整类型的概念,并且允许任何类包含(引用)任何其他类。


Jam*_*nze 5

因为:

static A b;
Run Code Online (Sandbox Code Playgroud)

(在类本身中)不是定义,因此不需要完整的类定义.

Java有不同的规则,并且没有不完整类型的概念.当然,Java中的变量永远不是用户定义的对象类型,而是对象类型的引用(更像是C++指针).C++中的等价物与Java中的变量声明相同Main* g;.