为什么我们不能像在 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::
不会死你的。
我想知道 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::
不会死你的。