class A
{
A a;//why can't we do this in C++ but it is allowed in Java?
};
使用这个问题,我开始知道为什么它在 C++ 中是不允许的,但为什么在 java 中是允许的?根据编译时不知道内存大小的相同论点,Java 也不应该允许这样做。
在 Java 中,如果有A a;
,a
是对 class 对象的引用A
。在 C++ 中,它不是一个引用,而是一个完整的对象。
因此,C++ 中生成的对象将是无限大的,这不是很实用。
在 C++ 中,您可以这样做:
class A {
A *a;
}
这就是您实现许多数据结构的方式,包括链表。
正如您所提到的,您不能在 C++ 中执行此操作:
class A {
A a;
}
你不能在 C++ 中这样做有几个原因:不仅因为它不知道A
(正如你提到的)的内存大小,还因为这意味着每个A
人都会有一个类型的成员,A
该成员将永远递归.
因此,Java 允许与上面的第一个示例等效:
class A {
A a;
}
碰巧这个语法 看起来和 C++ 语法的第二个例子一样,但实际上,它和第一个 C++ 例子的意思是一样的: 类A
有一个类型为“指针”(C++)或“引用”的成员变量(Java) 到 class 的对象A
。
第二种 C++ 语法没有等效的 Java 语法,因为在 Java 中,一个类的所有实例(即非基元)总是引用。
在 Java 中,这
A a;
表示 A 是对A
对象的引用。所以类A
不包含A
实例,就像在 C++ 中那样(这将是无限递归的,因此是不允许的)。
A a;
在中创建引用,Java
但不在 中创建引用C++
。
在一个对象中拥有同一对象的实例是不可能的。