【问题标题】:Difference between prefix and postfix increment operators overloading implementations for iterators in C++C++中迭代器的前缀和后缀增量运算符重载实现之间的区别
【发布时间】:2013-02-27 01:56:36
【问题描述】:

我正在阅读一本关于数据结构的书,现在正在尝试实现单链表数据结构。在实现迭代器时,我遇到了这些重载前缀和后缀增量的实现:

iterator &operator++()
{
    this->current = this->current->next;
    return *this;
}

iterator &operator++(int)
{
    iterator old = *this;
    ++(*this);
    return old;
}

我知道第一个是前缀,第二个是后缀,但我不明白为什么重载的后缀增量有不同的代码?如果我这样做会有什么问题?

iterator &operator++(int)
{
    this->current = this->current->next;
    return *this;
}

提前致谢。

【问题讨论】:

    标签: c++ iterator linked-list operator-overloading


    【解决方案1】:

    实际上,两个后缀版本都是错误的。 后缀迭代器必须返回一个副本,而不是一个引用。

    关键是后增量会更改增量对象,但会返回增量之前的版本。预增量更改对象并返回增量版本。他们的逻辑必须有相应的不同。

    之所以做出这种区分,是因为后增量和前增量在原始类型上具有相同的语义。示例:

    int i = 0;
    std::cout << i++ << std::endl;
    

    产生输出 0。具有重载迭代器的类应模仿该行为以保持一致性。如果您有自己的整数类和您展示的迭代器实现之一,结果将是 1,因此令人惊讶。

    后缀增量的正确实现在 99% 的情况下:

    iterator operator++(int)
    {
        iterator old = *this;
        ++(*this);
        return old;
    }
    

    【讨论】:

    • 我以为第一个是返回副本
    • @KudayarPirimbaev:不,请注意声明中的“&”(“迭代器 &operator++”)。它返回对局部变量的引用,因此具有未定义的行为。
    • 顺便说一句,前缀 one 返回引用是否正确,或者它也应该返回副本?
    • @KudayarPirimbaev:是的,它绝对应该返回一个引用。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多