有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么C++给了你拥有非新分配对象的选项?

在C++中,你可以制作不需要使用“新”关键字的类对象。像Java这样的语言(我相信很多其他更高级的语言也是如此,但现在我将重点讨论Java)没有给您提供创建不需要关键字new的类对象的选项。为什么Java不让您选择使类对象不基于新对象,并且在涉及类对象时仅限于函数的范围

     Car mycar=Car();
     mycar.setName("an old name");
     Car mycar2=mycar;
     mycar2.setName("a new name");
     cout<<mycar.name;
在C++中,这将导致“旧名称”。但在Java等语言中,您必须使用关键字new,mycar和mycar2共享同一指针,并打印“新名称”,因此您必须使用关键字new创建其他单独的对象以获得深度副本。我的问题是为什么java不实现非新的类对象。我的最终问题是,让所有类对象成为java中的新对象有什么好处。我希望这将问题改写得更具体一些。我以前没有真正使用过堆栈溢出,所以我正在尝试学习这个社区的工作方式


共 (3) 个答案

  1. # 1 楼答案

    <>这是因为C++是一种混合编程语言,最初从C语言继承,变量语义是EM>由拷贝(忘记指针,即使指针只是被复制到其他作为^ {CD1>})。您只需定义一个给定类型的变量:int i,这个创建一个intstruct S s;创建一个S。因此语义很自然地扩展到对象类型:C o创建类型为C的对象。这将导致静态分配的对象在离开作用域时也会自动销毁。对于动态分配的对象,情况几乎相同,但对象方式使用new操作符,让用户控制相应对象的初始化(新的方法基本上是自动调用malloc+init函数)

    这种方法的主要缺点是运行时存在两种对象:静态和动态分配的对象,如果不注意这一点,这可能是一个严重的问题

    在优点中,您可以使用现有的C程序,稍微调整它,将变量的类型从基本类型更改为对象类型,并让它简单地工作。这使得类似C的程序员可以稍微从过程模式切换到面向对象的模式,等等

    请记住,C++设计者的一般准则是:席如果存在设计选择,不要选择,实现两者,让程序员选择。»

    现在,不关心兼容性的主要面向对象语言的设计者可以自由地设计一些更连贯的东西,而这不是潜在问题的根源。例如,Java设计人员做了很多选择(无操作符重载、动态绑定、垃圾收集等)

  2. # 2 楼答案

    <>大部分C++是从C继承的,并且维护了一般原则:不为不使用的东西付费。p>

    要求通过指针引用所有变量和/或对象,并因此使用newmalloc(在C中)会导致性能下降。在C语言中,大型结构通常用指针引用,并用malloc()分配^{

  3. # 3 楼答案

    列出的其他语言使用垃圾收集来确定哪些对象是活动的

    虽然可以对堆栈分配的对象执行此操作,但这很棘手,因为当堆栈移动时,对这些对象的远程引用必须远程为空。这可能发生在不合时宜的时候

    为了让事情变得简单,它们强制垃圾收集对象生活在其生命周期可以延长到最长的未完成引用的地方

    C++要求程序员解决远程引用的生命周期问题。一旦他们将这一需求放在程序员身上,具有有限生存期的堆栈分配对象是切实可行的

    C++,使用寿命导致内存泄漏和内存损坏。其他语言仍然可能遭受泄漏(因为保留了一个非预期的引用,可能会保留无限量的资源)。文件处理生命周期和其他“昂贵”资源必须手动管理,以类似于C++如何要求您管理内存和对象寿命的方式列出的其他语言。p>