为啥我们不能像在 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 &amp;obj=new Splender(); 是一个错误,是时候回到a good text book了。 错误信息说明了原因。 这个问题是基于错误的前提。是的,我们可以在 C++ 中使用new ClassName() 【参考方案1】:

两件事。一:运算符 new 返回指向对象实例的指针,而不是引用。所以使用Bike* obj = new Splender();

二:不要太可爱,试试Bike&amp; 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 服务中包装一个函数,而不会延迟?

我们可以像在处理中那样在 PyQt5 中绘制 3D/2D 对象吗?

C 代码中的 Java 数组

java中,InetAddress为啥不能new对象

为啥Java没有复制构造函数?

我们可以像在 SQL Server 中那样加密雪花中的存储过程吗?