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