为什么我们不能在C ++中的同一个类中声明一个类的对象但是在Java中是允许的?

时间:2012-08-05 12:06:21

标签: java c++

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

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

4 个答案:

答案 0 :(得分:8)

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

因此,C ++中的结果对象将具有无限大小,这不太实用。

答案 1 :(得分:5)

在C ++中,你可以这样做:

class A {
    A *a;
}

这是您实现许多数据结构的方式,包括链接列表。

正如您所提到的,您无法在C ++中执行此操作:

class A {
    A a;
}

你不能在C ++中做到这一点有几个原因:不仅因为它不知道A的内存大小(如你所提到的),还因为它意味着每{{1}将有一个A类型的成员永远递归。

因此,Java允许等同于上面的第一个例子:

A

恰好这个语法 看起来与C ++语法的第二个例子相同,但实际上它具有相同的含义作为第一个C ++示例:类class A { A a; } 具有类型为“指针”(C ++)的成员变量或类A的对象的“引用”(Java)。

第二种C ++语法没有等效的Java语法,因为在Java中,类的所有实例(即非基元)总是引用。

答案 2 :(得分:2)

在Java中,这个

 A a;

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

答案 3 :(得分:1)

A a;Java中创建了引用,但未在C++中创建。

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