目前,我正在学习C ++,我不能换我周围为什么人会定义一个类的对象为指针(即头Car *c = new Car;,而不是Car c;为没有)明显的原因是什么?
举个例子:
#include <iostream>
class Car {
public:
void accelerate() { std::cout << "Accelerating!.\n"; }
};
int main() {
Car *c = new Car;
c->accelerate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当这样做更直观时,为什么要这样做:
#include <iostream>
class Car {
public:
void accelerate() { std::cout << "Accelerating!.\n"; }
};
int main() {
Car c;
c.accelerate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果需要一个指向对象的指针,总可以声明一个,不是吗?
为什么将类的对象定义为指针
一个不应该。通常要尽可能避免使用指针。但是,在进行多态时,它们是必需的。在这种情况下,请使用智能指针shared_ptr,unique_ptr而不是原始指针。
下面是一个使用指针的不好的例子,因为现在你有一个额外的问题,即“释放分配的内存”。
int main() {
Car *c = new Car;
c->accelerate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你是对的,第二个例子要好得多,应该是默认的方式。
每当出现此类问题时,最好看看C++ 核心指南怎么说:
R.11:避免显式调用 new 和 delete
原因
new 返回的指针应该属于一个资源句柄(可以调用 delete)。如果 new 返回的指针被分配给一个普通/裸指针,则该对象可能会泄漏。
ES.60:避免在资源管理功能之外新建和删除
原因
应用程序代码中的直接资源管理容易出错且乏味。
R.3:原始指针(T*)是非拥有的
原因
没有什么(在 C++ 标准或大多数代码中)另有说明,大多数原始指针是非拥有的。我们希望确定拥有指针,以便我们能够可靠且有效地删除拥有指针所指向的对象。(拥有指针是指拥有指针的所有权并负责释放它的指针。)
例子
Run Code Online (Sandbox Code Playgroud)void f() { int* p1 = new int{7}; // bad: raw owning pointer auto p2 = make_unique<int>(7); // OK: the int is owned by a unique pointer // ... }
因此,答案是仅在绝对需要时才使用指针,否则坚持使用引用和值。
std::vector如果可以,最好在这种情况下使用。