为啥我们不能像在 java 中那样使用 new ClassName() 而不是使用 new ClassName?
Posted
技术标签:
【中文标题】为啥我们不能像在 java 中那样使用 new ClassName() 而不是使用 new ClassName?【英文标题】:Why can't we use new ClassName() like we use in java,instead of using new ClassName?为什么我们不能像在 java 中那样使用 new ClassName() 而不是使用 new ClassName? 【发布时间】:2018-03-20 17:03:28 【问题描述】:我想知道 c++ 和 java 都使用 oops 概念,但语法却大不相同。
我发现 java 使用 new ClassName() 来获取对堆的引用,但获得对堆的相同引用,为什么 c++ 使用 new ClassName。
#include<iostream>
using namespace std;
class Bike
public:
virtual void run()
cout << "running";
;
class Splender :public Bike
public:
void run()
cout << "running safely with 60km";
;
int main()
Bike &obj = new Splender();//error but reason?
obj.run();
错误: 从“Splender*”类型的右值初始化“Bike&”类型的非常量引用无效
【问题讨论】:
看一本C++教科书,C++不是Java 如果你不知道Bike &obj=new Splender();
是一个错误,是时候回到a good text book了。
错误信息说明了原因。
这个问题是基于错误的前提。是的,我们可以在 C++ 中使用new ClassName()
。
【参考方案1】:
两件事。一:运算符 new 返回指向对象实例的指针,而不是引用。所以使用Bike* obj = new Splender();
二:不要太可爱,试试Bike& obj = *new Splender();
,因为new 可以在内存不足的情况下返回nullptr
,如果你取消引用它,你的程序会在那个时候崩溃。 (正如 user4581301 在 cmets 中指出的那样,你不得不使用丑陋的 delete *obj;
来清理这个对象。)
哦,using namespace std
是一种不好的做法。在您使用标准库的地方添加std::
不会杀死您。
【讨论】:
"你的程序会在那个时候崩溃。"不必要。这是未定义的行为。它可能看起来像它工作或雨独角兽。 在我曾经使用过的每个 C++ 实现(包括在 IBM 大型机上的 MVS 上运行的一个)中取消引用 null 会导致崩溃(或 MVS 上的 ABEND)。有时,对未定义行为的严格定义可以搁置一旁,以实践真实世界的经验。 必须给你那个。不记得上次我没有因为空值而崩溃。值得注意的是,new
更有可能throw
或尝试throw
而死,而不是返回nullptr
。
嗯,在现代编译器中,抛出的可能性更大。但是在内存极低的情况下,您仍然可以获得 null。此外,大多数编译器都有禁用异常的开关(全局和特别是在 new
内。)【参考方案2】:
有时我们认为做正确的事。 你有点混乱。试试:
Bike *obj=new Splender();
【讨论】:
【参考方案3】:#include <iostream>
class Bike
public:
virtual void run()
std::cout << "running";
virtual ~Bike()
;
class Splender: public Bike
public:
void run() override
std::cout << "running safely with 60km";
;
int main()
Bike *obj = new Splender(); // new returns a pointer to a dynamically allocated object
obj->run();
delete obj;
显示:
running safely with 60km
【讨论】:
我不明白你在说什么;-)以上是关于为啥我们不能像在 java 中那样使用 new ClassName() 而不是使用 new ClassName?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会像在 ng-file-upload 示例使用代码中那样在 AngularJS $timeout 服务中包装一个函数,而不会延迟?