共享指针 [] 运算符和 ++ 运算符

Posted

技术标签:

【中文标题】共享指针 [] 运算符和 ++ 运算符【英文标题】:Shared pointer [] operator and ++ operator 【发布时间】:2016-10-21 06:44:32 【问题描述】:

我们可以将 [] 运算符或 ++ 与唯一指针或 shared_pointer 一起使用吗?当我们将它用于原始指针时

int * a = new int[10];
a[0] = 2; // We can use [] operator;

智能指针有类似的方法吗?

如果有的话应该什么时候用这个?

如果不存在那为什么? 多维数组也可以吗?

【问题讨论】:

cplusplus.com/reference/memory/unique_ptr 对shared_ptr做同样的事情 您可以在数组上使用 shared_pointer :std::shared_ptr<std::array<int, 10>> 【参考方案1】:

std::unique_ptr 和 std::shared_ptr 都提供 operator[] 用于对存储数组的索引访问。如果他们管理的是数组,您可以使用它们。

operator[] 提供对由unique_ptr 管理的数组元素的访问。

例如

std::unique_ptr<int[]> a(new int[10]);
a[0] = 2; // We can use [] operator;

注意索引必须小于数组中的元素个数;否则,行为未定义。

很遗憾,我们不能直接对它们使用operator++;这不是smart pointers 应该做的,它们通常用于管理指针。

如果你只想要一个数组,我建议你使用std::vectorstd::array

【讨论】:

它是指向 int[] 的指针,而不是在原始指针的情况下指向 int 的指针。我们也可以使用 ++ 运算符吗? @Anshuman 你指的是什么指针?它们提供与原始指针相同的行为。是的,我们不能直接在他们身上使用operator++;这不是智能指针应该做的。 谢谢,多维数组呢 @Anshuman 基本上它们是相同的,二维数组仍然可以被视为某物的一维数组(即数组)。但是将它与智能指针一起使用似乎令人困惑,您可以使用std::vectorstd::array,如std::vector&lt;std::vector&lt;T&gt;&gt;【参考方案2】:

是的。

这是一个例子 http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_at

 std::unique_ptr<int[]> fact(new int[size]);

【讨论】:

以上是关于共享指针 [] 运算符和 ++ 运算符的主要内容,如果未能解决你的问题,请参考以下文章

在具有智能指针的类上正确实现复制构造函数和等于运算符

#运算符不同的指针类型数组和指针指针运算堆栈静态区只读区下标VS指针

C语言-指针

为对象指针实现复制构造函数和运算符的正确方法是啥

C++ 中的指针成员 ->* 和 .* 运算符是啥?

为啥关系运算符不能在指针和数组中工作[关闭]