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

Anu*_*nuj 2 c++ java

class A
{
    A a;//why can't we do this in C++ but it is allowed in Java?
};
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*Mat 8

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

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


Ada*_*kin 5

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

class A {
    A *a;
}
Run Code Online (Sandbox Code Playgroud)

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

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

class A {
    A a;
}
Run Code Online (Sandbox Code Playgroud)

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

所以,Java,允许相当于上面的第一个例子:

class A {
    A a;
}
Run Code Online (Sandbox Code Playgroud)

恰好这个语法 看起来与C++语法的第二个例子相同,但事实上,它与第一个C++示例具有相同的含义:Class A有一个类型为"pointer"(C++)或"reference"的成员变量(Java)到类的对象A.

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