为什么我们不能像在 java 中那样使用 new ClassName(),而是使用 new ClassName?

Why can't we use new ClassName() like we use in java,instead of using new ClassName?

我想知道 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&' 类型的非常量引用进行无效初始化
#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

有时我们认为做正确的事。 你有点混乱。尝试:

Bike *obj=new Splender();

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

二:不要变得可爱并尝试 Bike& obj = *new Splender(); 因为 new 可以 return nullptr 在内存不足的情况下,如果您取消引用它,您的程序将在那时崩溃。 (而且你被迫使用丑陋的 delete *obj; 来清理这个对象,正如 user4581301 在评论中指出的那样。)

哦,using namespace std 是一种不好的做法。在你使用标准库的地方加上std::不会死你的。