原始C++指针是第一类对象吗?

Sha*_*mar 8 c++ programming-languages

根据维基百科:

一个对象是第一类的:

  • 可以存储在变量和数据结构中
  • 可以作为参数传递给子程序
  • 可以作为子例程的结果返回
  • 可以在运行时构造
  • 具有内在身份(独立于任何给定名称)

有人曾告诉我原始指针不是第一类对象,而像std :: auto_ptr这样的智能指针是.但对我来说,C++中的原始指针(对象或函数)在我看来确实满足上述条件才有资格作为第一类对象.我错过了什么吗?

小智 1

实际上,“指针是 FCO”和“指针不是 FCO”都是正确的。我们需要在各自的背景下看待这些陈述。(FCO - 一级物体)

\n\n

当我们谈论 C++ 中的“指针”时,我们谈论的是存储其他数据地址的数据类型。现在这是否是 FCO,实际上取决于我们设想如何使用它。不幸的是,这种使用语义不是 C++ 中指针内置的。

\n\n

如果我们仅使用指针来“指向”数据,它将满足 FCO 的要求。然而,如果我们使用指针来“保存”数据,那么它就不能再被视为 FCO,因为它的复制和赋值语义不起作用。这种“资源处理”指针(或更直接地称为“原始指针”)是我们在智能指针研究的背景下感兴趣的。这些不是 FCO,而相应的智能指针则是。相比之下,仅仅跟踪指针将继续满足 FCO 的要求。

\n\n

《Modern C++ Design》一书中的以下段落很好地阐明了这一点。

\n\n

我引用智能指针一章的内容:

\n\n
\n

具有值语义的对象是\n 可以复制并分配给\n 的对象。int 类型是一流对象的完美示例。您可以自由创建、复制和更改整数值。用于在缓冲区中进行迭代的指针也具有值\n 语义\xe2\x80\x94,您将其初始化为指向缓冲区的开头,\n 并对其进行碰撞直至到达末尾。\在此过程中,您可以将其值复制到其他变量以保存临时结果。

\n\n

然而,对于保存用 new 分配的值的指针,情况就非常不同了。一旦你写完\n

\n\n

Widget* p = new Widget;\n 变量 p 不仅指向而且拥有为 Widget 对象分配的内存。这是因为稍后您必须发出 delete\np 以确保 Widget 对象被销毁并释放其内存。\n 如果在刚刚显示的行后面的行中\n 您编写

\n\n

p = 0;// 给 p 指定其他内容,你就失去了 p 先前指向的对象的所有权,并且你根本没有机会再次控制它。你有一个资源泄漏,\n并且资源泄漏没有任何帮助。

\n
\n\n

我希望这能澄清。

\n