-1

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

class A
{
     A b;
};
int main() {}

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

class A
{
     static A b;
}
int main() {}

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

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

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

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

4

2 回答 2

6

因为:

static A b;

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

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

于 2013-05-13T11:06:21.750 回答
6

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

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

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

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

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

于 2013-05-13T11:10:20.373 回答