C++和Java对象模型之间的差异

Ali*_*Ali 6 c++ java constructor

  1. 在Java中,序列化对象非常容易.在C++中,只有memcpy它们像C结构(没有多态性)才对安全(?)对象.在C++中,如果编译器能够生成默认(普通)复制构造函数,那么为什么它不能生成自动序列化的代码?

  2. 在Java中,只能从ctor访问静态函数和数据成员.在C++中,我可以愉快地使用ctor中的非静态成员和函数.

  3. 在Java中,我可以在类中初始化内联的数据成员.在C++中,这是一个编译错误.

  4. 在Java中,我可以初始化finalctor中的成员.在C++中,我必须const在初始化列表中初始化成员.在C++中,当控制到达ctor的主体时,所有成员ctor都运行了,对吧?

  5. 在Java中,ctor可以调用另一个ctor.在C++中,我们不能这样做.

  6. 在Java中,this直到ctor返回之后才无效(this参考的转义,多线程中的错误).什么时候this在C++中有效?在this可以很容易地在两个C++和Java中逸出:在构造函数登记尚未构造的对象,以监听器(观察者模式).

  7. 在Java中,我不能在派生类中创建基类private的公共函数.我很震惊地看到在C++中是好的甚至是有用的.

任何人都可以对这些差异做出简短的解释吗?

更新.到目前为止,试图收集答案.

  1. Boost有类似序列化的支持.(托尼)

  2. 尽管我搞砸了这一点,但Alf P. Steinbach给出了一个有趣的例子.

  3. C++ 0x将支持比C++ 98更实用的初始化.(Alf P. Steinbach)#3在C++ 0x中是合法的(Ken Bloom)

  4. 在构造函数的{body}开始执行时,保证在构造函数自己的类中声明的数据成员已完全构造.(C++ - FAQ-精简版)

  5. C++ 0x将允许构造函数调用其他对等构造函数(Wikipedia,C++ 0x)

  6. C++ 03考虑在构造函数完成执行时构造的对象(Wikipedia).

  7. 访问控制之类的东西与对象模型没什么关系:这是访问控制系统的一个特性,它是一个编译时功能.(Yttrill)

Ton*_*roy 4

在 Java 中,序列化对象非常容易。在 C++ 中,只有当它们类似于 C 结构(无多态性)时,memcpy 对象才是安全的(?)。

Java 是一种解释性语言(或者最近,正如 Billy 评论的那样,JIT 编译),因此它别无选择,只能在运行时携带程序中每种数据类型的元数据包袱。在解释器、VM、可选编译器和元数据开销之间,Java 程序需要大量内存。C++ 是一种编译语言,Java 所做的许多决策都是在编译时做出的,并且元数据无法解释以指导运行时的序列化。一般来说,即使在编译时,元数据也不会公开,可能是因为不同的编译器供应商对程序的建模方式完全不同,并且他们没有共同协商合适的表示形式。这也是一项艰巨的工作。Bjarne Stroustrup 有一些关于如何公开此类信息的论文,但它甚至没有计划用于 C++0x。同时,通过一些手动标记,C++ 程序可以序列化对象 - 请参阅 boost 以获得良好的实现。

在 Java 中,我可以在类中内联初始化数据成员。在C++中这是一个编译错误。

每个 C++ 构造函数都提供了关于如何初始化对象的完整、独立的视图。如果值得的话,可以将常见的构造步骤纳入支持例程中,但对其的调用在构造函数中仍然可见。必须检查分散在课堂上的各种作业会使这种情况分散化,尽管这确实很方便。我敢打赌,这里有很多东西。

在Java中,我可以初始化ctor中的final成员。在 C++ 中,我必须对初始化列表中的 const 成员进行初始化。

这反映了这样的想法:const 成员是以其唯一的值创建的,并且不会从某种不确定或空状态转换到初始化状态。

在 Java 中,一个 ctor 可以调用另一个 ctor。在 C++ 中我们不能这样做。

是的,这在 C++ 中有时有点烦人 - 特别是对于需要位于初始化列表中的引用和常量,但您可以将其他常见构造步骤纳入支持函数中。我认为 C++ 的位置反映了构造函数在构造基数、成员、指向虚拟调度表的指针等方面的工作 - 在机器代码级别不一定可以从另一个构造函数调用一个构造函数并执行正确的步骤。编译器可能需要生成第二个可从另一个构造函数调用的版本,或者内联被调用构造函数的正确部分,但这是一种隐藏的膨胀。

在Java中,我无法在派生类中将基类的公共函数设为私有。我很震惊地发现在 C++ 中它是可以的,甚至是有用的。

鉴于您承认它很有用,也许 Java 应该添加它。

谁能对这些差异给出简短的解释?

嗯,我尝试过。