Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 前缀和后缀增量运算符之间的差异C++;_C++_Iterator_Linked List_Operator Overloading - Fatal编程技术网

C++ 前缀和后缀增量运算符之间的差异C++;

C++ 前缀和后缀增量运算符之间的差异C++;,c++,iterator,linked-list,operator-overloading,C++,Iterator,Linked List,Operator Overloading,我正在读一本关于数据结构的书,现在正试图实现单链表数据结构。在实现迭代器时,我遇到了这些重载前缀和后缀增量的实现: iterator &operator++() { this->current = this->current->next; return *this; } iterator &operator++(int) { iterator old = *this; ++(*this); return old; }

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

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;
}

提前谢谢。

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

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

之所以有这种区别,是因为后增量和前增量在基元类型上具有相同的语义。例如:

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

我想第一个是返回一个copy@KudayarPirimbaev:否,请注意声明中的“&”(“迭代器和运算符++”)。它返回对局部变量的引用,因此具有未定义的行为。顺便问一下,前缀one返回引用是正确的还是应该返回副本?@KudayarPirimbaev:是的,它应该绝对返回引用。
iterator operator++(int)
{
    iterator old = *this;
    ++(*this);
    return old;
}