草庐IT

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

coder 2024-01-31 原文

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question



  • 在 Java 中,序列化对象非常容易。在 C++ 中,只有安全(?)到 memcpy对象,只要它们像 C 结构(没有多态)。在 C++ 中,如果编译器能够生成默认的(平凡的)复制构造函数,那么为什么它不能生成用于自动序列化的代码?
  • 在 Java 中,构造函数只能访问静态函数和数据成员。在 C++ 中,我可以愉快地使用 ctor 中的非静态成员和函数。
  • 在 Java 中,我可以在类中内联初始化数据成员。在 C++ 中,这是一个编译错误。
  • 在 Java 中,我可以初始化 final ctor 中的成员。在 C++ 中,我必须初始化 const初始化列表中的成员。 在 C++ 中,当控制权到达 ctor 的主体时,ctor 的所有成员都已运行,对吗?
  • 在 Java 中,一个 ctor 可以调用另一个 ctor。在 C++ 中,我们不能这样做。
  • 在 Java 中,this直到 ctor 返回后才有效(this 引用的转义,多线程中的错误)。什么时候this在 C++ 中有效吗? this在 C++ 和 Java 中都可以轻松转义:将尚未构造的对象注册到 ctor 中的监听器 (观察者模式)。
  • 在 Java 中,我不能在派生类中将基类的公共(public)函数设为私有(private)。我很震惊地看到在 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)
  • 最佳答案

    In Java it is very easy to serialize objects. In C++ it is only safe(?) to memcpy objects as long as they are like C structs (no polymorpism).



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

    In Java, I can initialize data members inline, in the class. In C++ it is a compile error.



    每个 C++ 构造函数都提供了一个关于如何初始化对象的完整、独立的 View 。如果值得的话,可以将常见的构造步骤分解为支持例程,但对它的调用在构造函数中仍然可见。必须检查分散在类(class)中的各种作业会使它离域,尽管这当然很方便。这里有很多很多,我会冒险。

    In Java I can initialize final members in the ctor. In C++ I have to do the initialization of the const members in the initialization list.



    这反射(reflect)了 const 成员以其唯一的值创建的想法,并且不会从某些不确定或空状态转换到初始化状态。

    In Java a ctor can call another ctor. In C++ we cannot do that.



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

    In Java, I cannot make a public function of the base class private in the derived class. I was shocked to see that in C++ is OK and even useful.



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

    Could anyone give a short explanation for these differences?



    嗯,我试过了。

    关于java - C++ 和 Java 对象模型之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4405074/

    有关java - C++ 和 Java 对象模型之间的差异的更多相关文章

    1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

      在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

    4. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    6. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

      我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

    8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    9. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

      我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

    10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

      我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

    随机推荐