给出java和C ++中的类Line,以及java和C ++中的以下声明 -
Line[] p;
和
Line *p;
运行以下代码时,两种语言之间的语义有何不同:
p = new Line[7];
特别是,两种语言都以相同的方式为数组分配堆内存吗?
抱歉,我对此事进行了研究,但我仍然觉得我还没有完全理解。
谢谢!
答案 0 :(得分:3)
您正在比较不相同的Java和C ++代码。 以下C ++相当于您的Java代码(引用数组):
Line **p;
p = new Line*[7];
您发布的C ++版本:
Line *p;
p = new Line[7];
是一个对象数组,使用默认的'Line'构造函数初始化数组的每个元素(尝试使用显式的1参数构造函数,你会发现C ++告诉你需要一个默认的构造函数)。 Java没有相当于这种创建非基本类型数组的方法,它们使每个元素都默认构造 - 在Java中,非基本类型数组的所有元素都是'null',直到你明确地赋值它们。)
答案 1 :(得分:1)
当在Java中声明数组时,它们存储为引用数组。在C ++中初始化Line
类的数组时,您不会遇到这种开销成本,因为您的数组将保存对象,而不仅仅是它们的引用。
答案 2 :(得分:0)
如上所述,等效的C ++代码实际上是
Line **p;
p = new Line*[7];
因为Java分配了一个引用数组,而不是ad-hoc对象数组。
在C ++中,new
运算符可以保证从堆中分配内存。
在Java中 - 它取决于。通常new
关键字从堆中分配内存,但是一些编译器(如HotSpot)会执行所谓的“转义分析”:如果编译器检测到指针未从函数返回,也不会转到不同的线程 - 它可以在堆栈中声明对象(等同于Line p[7]
C ++)