2

我正在尝试实现一个 List 和 Iterator 类(我们的作业,我们应该以 stl 样式实现我们自己的列表)。我有一个关于++运营商的问题。在我的实现中,++不返回任何内容:

void operator++();

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

Iterator& operator++();

我对它们都进行了测试,似乎它们都有效。但我相信一定有很大的不同。但我是 C++ 语言的新手。所以我看不到。有人可以帮我吗?

4

3 回答 3

3

这里的共同约定是重载运算符应该类似于普通运算符。例如,您可以:

int x = 5;
int y = ++x;

因此,您的迭代器确实应该在类似的上下文中可用:

Iterator i = smth.begin();
Iterator j = ++i;

你朋友的版本允许这样做。

还有一个古老的 C 笑话:

++i = 0;

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

于 2013-04-03T10:32:34.370 回答
1

不同之处在于您朋友的版本可以以如下形式调用

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

it一些迭代器在哪里。库函数和客户端代码可能依赖于此,所以总是*this从重载的operator++. 所有标准库迭代器都以这种方式工作,对其建模的指针也是如此。

于 2013-04-03T10:30:34.777 回答
1

不同之处在于,他的运算符可以像迭代器是指针一样使用,而您的则不能。使用指针,您可以执行以下操作:

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

为使其与迭代器一起使用,++运算符必须在增量之前(或之后)返回值,具体取决于运算符的前置或后置位置。您的实现不会那样做。尽管从技术上讲它是可以的,但结果运算符并没有那么实用,因此最好更改您的实现以返回一个值。

于 2013-04-03T10:30:57.073 回答