操作符++的正确返回类型

Correct return type for the operator ++

本文关键字:返回类型 操作符      更新时间:2023-10-16

我正在尝试实现List和Iterator类(我们的作业,我们应该以stl风格实现我们自己的列表)。我有一个关于++算子的问题。在我的实现中,++不返回任何东西:

void operator++();

但是我的一个朋友是这样实现的:

Iterator& operator++();

我测试了他们两个,似乎他们都工作。但我相信肯定有很大的不同。但是我是c++语言的新手。所以我看不见它。有人能帮帮我吗?

这里的一般约定是重载操作符应该类似于普通操作符。例如,您可以:

int x = 5;
int y = ++x;
所以你的迭代器应该在类似的上下文中可用:
Iterator i = smth.begin();
Iterator j = ++i;

你朋友的版本允许这个

还有一个古老的C笑话:

++i = 0;

所以是的,你的operator ++()应该返回*this作为左值来允许这种东西,所以返回类型是Iterator&而不是Iteratorconst Iterator&

不同的是,你朋友的版本可以在

// loop that skips the first element
while (++it != end)
    // perform operation

,其中it是某个迭代器。库函数和客户端代码可能依赖于此,因此总是从重载的operator++返回*this。所有标准库迭代器都是这样工作的,它们所基于的指针也是如此。

区别在于,他的操作符可以当作迭代器指针来使用,而你的操作符则不能。对于指针,你可以这样做:

char *p1, *p2;
...
p1 = ++p2;

对于迭代器来说,++操作符必须返回自增操作符之前(或之后)的值,这取决于操作符的前位或后位。您的实现不会这样做。虽然从技术上讲是可以的,但是结果操作符的功能不太好,因此最好更改实现以返回一个值。