为什么有些人将对象定义为指针?

Har*_*ris 9 c++ oop pointers

目前,我正在学习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)

如果需要一个指向对象的指针,总可以声明一个,不是吗?

Waq*_*med 5

为什么将类的对象定义为指针

一个不应该。通常要尽可能避免使用指针。但是,在进行多态时,它们是必需的。在这种情况下,请使用智能指针shared_ptrunique_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++ 标准或大多数代码中)另有说明,大多数原始指针是非拥有的。我们希望确定拥有指针,以便我们能够可靠且有效地删除拥有指针所指向的对象。(拥有指针是指拥有指针的所有权并负责释放它的指针。)

例子

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
   // ...
}
Run Code Online (Sandbox Code Playgroud)

因此,答案是仅在绝对需要时才使用指针,否则坚持使用引用和值。

什么时候使用指针?

  • 当你在做多态时(使用智能指针)
  • 当您需要一个巨大的数组(> 1MB)时,因为堆栈大小是有限的。(Linux 上为 2 - 8 MB(通常)Windows上为1 MB)。std::vector如果可以,最好在这种情况下使用。
  • 当您使用“C”库或处理遗留C++ 代码时,有时可能需要指针。