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具有值语义的对象是\n 可以复制并分配给\n 的对象。int 类型是一流对象的完美示例。您可以自由创建、复制和更改整数值。用于在缓冲区中进行迭代的指针也具有值\n 语义\xe2\x80\x94,您将其初始化为指向缓冲区的开头,\n 并对其进行碰撞直至到达末尾。\在此过程中,您可以将其值复制到其他变量以保存临时结果。
\n\n然而,对于保存用 new 分配的值的指针,情况就非常不同了。一旦你写完\n
\n\nWidget* p = new Widget;\n 变量 p 不仅指向而且拥有为 Widget 对象分配的内存。这是因为稍后您必须发出 delete\np 以确保 Widget 对象被销毁并释放其内存。\n 如果在刚刚显示的行后面的行中\n 您编写
\n\np = 0;// 给 p 指定其他内容,你就失去了 p 先前指向的对象的所有权,并且你根本没有机会再次控制它。你有一个资源泄漏,\n并且资源泄漏没有任何帮助。
\n
我希望这能澄清。
\n