为什么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; carmycar=Car(); mycar.setName(“旧名称”); Car mycar2=mycar; mycar2.设置名称(“新名称”); cout

为什么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; carmycar=Car(); mycar.setName(“旧名称”); Car mycar2=mycar; mycar2.设置名称(“新名称”); cout,java,c#,python,c++,Java,C#,Python,C++,列出的其他语言使用垃圾收集来确定哪些对象是活动的 虽然可以对堆栈分配的对象执行此操作,但这很棘手,因为当堆栈移动时,对这些对象的远程引用必须远程为空。这可能发生在不合时宜的时候 为了让事情变得简单,它们强制垃圾收集对象生活在其生命周期可以延长到最长的未完成引用的地方 C++要求程序员解决远程引用的生存期问题。一旦他们将这一需求放在程序员身上,具有有限生存期的堆栈分配对象是切实可行的 C++在生命周期内的错误会导致泄漏和内存损坏。其他语言仍然可能遭受泄漏(因为保留了一个非预期的引用,可能会保留无限

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

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

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

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


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

< P>大部分C++是从C继承的,并维护了一般原则,即不为不使用的东西付费。
要求通过指针引用所有变量和/或对象,从而使用
new
malloc
(在C中)会导致性能损失。在C语言中,大型结构通常用指针引用,并用
malloc()
分配<代码>新的<代码>在C++中实现相同的事情,但也允许初始化更复杂的对象。但是,像C一样,对象可以在堆栈上实例化,这样可以提高性能。

< P>这是因为C++是一种混合编程语言,最初是从C继承的,变量语义是拷贝(即使指针只是作为一个<代码> int >代码>,也可以忽略指针。您只需定义给定类型的变量:
inti
,这将创建一个
int
结构创建一个
S
。所以语义很自然地扩展到了对象类型:
co
创建了一个
C
类型的对象。这将导致静态分配的对象在离开作用域时也会自动销毁。对于动态分配的对象,情况几乎相同,但对象方式使用了
new
操作符,允许用户控制相应对象的初始化(new基本上是对malloc+init函数的自动调用)

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

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

请记住,C++设计者的一般准则是:席如果存在一个设计选择,不要选择,实现两者,让程序员选择。
现在,不关心兼容性的主要面向对象语言的设计者可以自由地设计一些更连贯的东西,而这不是潜在问题的根源。Java设计人员(例如)做了很多选择(无操作符重载、动态绑定、垃圾收集等)。

为什么这会被否决。我觉得这是个合理的问题,我不明白为什么你认为C++是唯一不需要使用“新”关键字的语言。Python没有-实际上它没有保留字
new
。Python中有一个新的
函数,但很少使用。只有在少数特殊情况下才需要。一种语言的关键字不应混淆或与另一种语言的关键字进行比较,即使关键字恰好相同,我的意思是python通过引用传递类对象,据我所知,不会像C++中那样通过引用传递类对象——“通过引用传递”是什么意思?即使有多个定义,都取决于语言。谢谢,这是有意义的,所以使用new不如只创建没有new的变量那么有效?如果C++中没有错误地使用堆中的新用途内存,而不是从堆栈中使用新的内存,对吗?它非常适用于快速操纵小对象,当范围退出时,您希望这些对象自动消失。而且,内存访问往往非常快,并且不需要额外的开销来获取和释放堆内存。您必须注意来自其他语言的一件事是,不能将引用或指针超出范围传递到堆栈上的对象。人们经常看到新手在本地范围内创建数组,然后返回指向它的指针。合法的语言隐藏的参考计数器,但不是在C或C++。@ Pete Becker感谢编辑。我太草率了,而且可能会产生误导,因为
alloc
通常是一个(危险的)语言扩展,它会在堆栈上保留空间。关于其他语言垃圾收集及其限制的好观点。