【发布时间】:2012-09-30 19:53:42
【问题描述】:
Java 具有默认构造函数,但与 C++ 的功能不同。
在 C++ 中,在声明对象时会隐式调用默认构造函数,因此无需显式“新建”它。但在 Java 中,必须显式初始化对象。有什么特别的原因吗?对此有任何功能要求吗?
【问题讨论】:
-
你能举例说明你的意思吗?也就是说,除了“Java 不是 C++,它以它的工作方式工作”之外,我不确定这里是否有任何答案
标签: java
Java 具有默认构造函数,但与 C++ 的功能不同。
在 C++ 中,在声明对象时会隐式调用默认构造函数,因此无需显式“新建”它。但在 Java 中,必须显式初始化对象。有什么特别的原因吗?对此有任何功能要求吗?
【问题讨论】:
标签: java
仅当 C++ 声明在堆栈上创建对象时。所有 Java 对象都是基于堆的,所以这不是一个选项。在这两种语言中,构造函数都会在创建新对象时调用。
// C++
Obj obj; // stack
Obj* pObj = new Obj; // heap
// Java
Obj obj = new Obj(); // heap (stack not possible)
【讨论】:
class Foo { Bar _bar; } ... Foo *foo = new Foo();,其中Foo分配在堆上,但bar将使用Bar的默认构造函数进行初始化。所以堆栈分配和堆分配之间的区别并不真正相关。是处理对象指针还是对象值(Java 没有)。
技术上,
在 C++ 中,在声明对象时会隐式调用默认构造函数
不正确,但不完整。如果一个对象有一个用户定义的默认构造函数,你不能只声明它。声明点也是定义和初始化。
在 Java 中,引用可以是 null,而在 C++ 中则不能。在 C++ 中,只有指针可以是 NULL。所以有不同的语义。
JavaObject o = null; //valid Java
//invalid C++
【讨论】:
Java 构造:
MyClass myObject;
等价于(-ish)以下 C++:
MyClass *myObject;
不要:
MyClass myObject;
没有与后者等效的 Java。
【讨论】: