正确的运算符返回类型++

时间:2013-04-03 10:25:49

标签: c++ operator-overloading

我正在尝试实现List和Iterator类(我们的作业,我们应该以stl样式实现我们自己的列表)。 我对++运算符有疑问。 在我的实现中,++不会返回任何内容:

void operator++();

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

Iterator& operator++();

我测试了它们,看起来它们都有效。但我相信必定会有一些很大的不同。但我是C ++语言的新手。所以我看不到它。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

这里的常见惯例是重载运算符应该类似于普通运算符。 例如,您可以:

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

所以你的迭代器确实应该在类似的上下文中使用:

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

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

还有一个古老的C笑话:

++i = 0;

是的,您的operator ++()应该返回*this作为左值以允许此类内容,因此返回类型为Iterator&而不是Iterator或{{1} }。

答案 1 :(得分:1)

不同之处在于您的朋友的版本可以通过

等形式调用
// loop that skips the first element
while (++it != end)
    // perform operation

其中it是一些迭代器。库函数和客户端代码可能依赖于此,因此始终从重载的*this返回operator++。所有标准库迭代器都以这种方式工作,因此建模它们的指针也是如此。

答案 2 :(得分:1)

不同之处在于,他的运算符可以像迭代器是一个指针一样使用,而你的运算符则不能。使用指针,您可以这样做:

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

为了使用迭代器,++运算符必须在递增之前(或之后)返回值,具体取决于运算符的前置或后置位置。您的实现不会这样做。虽然技术上没问题,但结果运算符不能正常运行,因此最好更改实现以返回值。