简而言之,我想问“使用智能指针的一个好理由是什么?”例如[std::unique_ptr
但是,我没有问使用智能指针的原因在常规(哑)指针上。我认为每个人都知道,或者快速搜索就能找到原因。
我要问的是这两种情况的比较:
给名为MyObject
的类(或结构)使用
std:queue<std::unique_ptr<MyObject>>queue;
而不是
std:queue<MyObject> queue;
(它可以是任何容器,不一定是队列)
为什么有人应该使用选项1而不是2?
这实际上是一个好问题。
我有几个原因可以想到:
多态仅适用于引用和指针,不适用于值类型。因此,如果要将派生对象保存在容器中,则不能使用std::queue<MyObject>
。一个选项是unique_ptr
,另一个是reference_wrapper
从容器外部引用包含的对象(*)。根据容器的不同,它保存的元素可以move,从而使以前对其的引用无效。例如std::vector::insert
或容器本身的移动。在这种情况下,std::unique_ptr<MyObject>
确保引用是有效的,无论容器如何处理(ofc,只要unique_ptr
处于活动状态)。
(*)我在这里使用“ reference”及其英文含义,而不是C ++类型。引用对象的任何方式(例如,通过原始指针)
第一个声明生成带有指针元素的容器,第二个声明生成纯对象。
这里是在对象上使用指针的一些好处:
而且,多态性被认为是面向对象编程的重要特征之一。在C ++中,多态主要分为两种类型:
这种多态性是通过函数重载或运算符重载实现的。
这种类型的多态性是通过函数重写实现的,如果我们要使用基类来使用这些函数,则必须使用指针而不是对象。
用例:您想将某些内容存储在具有恒定索引的std::vector
中,同时又能够从该向量中删除对象。