【发布时间】:2011-05-23 05:58:05
【问题描述】:
在 Java 中,序列化对象非常容易。在 C++ 中,只有
memcpy对象是安全的(?),只要它们像 C 结构(没有多态性)。在 C++ 中,如果编译器能够生成默认(平凡的)复制构造函数,那么为什么它不能生成用于自动序列化的代码?在 Java 中,只能从 ctor 访问静态函数和数据成员。在 C++ 中,我可以愉快地使用 ctor 中的非静态成员和函数。在 Java 中,我可以在类中内联初始化数据成员。在 C++ 中,这是一个编译错误。
在 Java 中,我可以初始化 ctor 中的
final成员。在 C++ 中,我必须对初始化列表中的const成员进行初始化。 在 C++ 中,当控制到达 ctor 的主体时,ctor 的所有成员都已运行,对吧?在 Java 中,一个 ctor 可以调用另一个 ctor。在 C++ 中我们不能这样做。
在 Java 中,
this直到 ctor 返回后才有效(this引用的转义,多线程中的一个错误)。this在 C++ 中何时有效?this可以在 C++ 和 Java 中轻松转义:在 ctor 中向 Listeners 注册尚未构造的对象(观察者模式)。在 Java 中,我无法在派生类中将基类的公共函数设为私有。我很震惊地看到在 C++ 中它还可以,甚至有用。
谁能简要解释这些差异?
更新。试图收集到目前为止得到的答案。
Boost 有一些类似序列化的支持。 (托尼)
尽管我搞砸了这一点,但 Alf P. Steinbach 还是举了一个有趣的例子。
C++0x 将支持比 C++98 更实用的初始化。 (Alf P. Steinbach) #3 在 C++0x 中将是合法的 (Ken Bloom)
保证在构造函数自己的类中声明的数据成员在构造函数的 {body} 开始执行时已经完全构造。 (c++-faq-lite)
C++0x 将允许构造函数调用其他对等构造函数(维基百科,C++0x)
C++03 认为对象在其构造函数完成执行时被构造(维基百科)。
诸如访问控制之类的东西与对象模型几乎没有关系:这是访问控制系统的一个特性,它是一个编译时特性。 (Yttrill)
【问题讨论】:
-
不,那时
memcpy他们甚至都不安全。 (另外,一个 ctor 可以在 C++0x 中调用另一个 ctor)。 -
哦,Java 没有ctors——它们有构造函数。在 Java 中,他们更喜欢将所有内容都拼出来,而不是使用晦涩难懂的缩写——这是另一个哲学差异。
-
@Bill K:C++ 也喜欢把所有的东西都拼出来。 (即
std::set_symmetric_difference或std::lexicographical_compare)。在 C 中看到缩短名称更为常见,因为 C 指定链接器名称只需要由前 8 个字符来区分。 -
#2 for Java 是错误的,我可以愉快地从其构造函数调用对象上的方法。 #6 对于 Java 也是错误的,允许
this引用转义到构造函数中的另一个线程是完全合法的。当然,允许this引用转义是相当不可取的。 -
#2 和#4 相互矛盾(提示:#2 错误)
标签: java c++ constructor