2
class A
{
    A a;//why can't we do this in C++ but it is allowed in Java?
};

使用这个问题,我开始知道为什么它在 C++ 中是不允许的,但为什么在 java 中是允许的?根据编译时不知道内存大小的相同论点,Java 也不应该允许这样做。

4

4 回答 4

8

在 Java 中,如果有A a;,a是对 class 对象的引用A。在 C++ 中,它不是一个引用,而是一个完整的对象。

因此,C++ 中生成的对象将是无限大的,这不是很实用。

于 2012-08-05T12:09:31.353 回答
5

在 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 中,一个类的所有实例(即非基元)总是引用。

于 2012-08-05T12:16:49.147 回答
2

在 Java 中,这

 A a;

表示 A 是对A对象的引用。所以类A不包含A实例,就像在 C++ 中那样(这将是无限递归的,因此是不允许的)。

于 2012-08-05T12:10:08.303 回答
1

A a;在中创建引用,Java但不在 中创建引用C++

在一个对象中拥有同一对象的实例是不可能的。

于 2012-08-05T12:11:44.370 回答