class A
{
A a;//why can't we do this in C++ but it is allowed in Java?
};
使用这个question,我开始知道为什么在C ++中不允许它,但为什么在java中允许它?根据编译时不知道内存大小的相同论点,它也不应该在Java中允许。
答案 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++
中创建。
在一个对象中有一个相同对象的实例是不可能的。