操作符“=”的巧妙用法和陷阱
写程序久了,一直习惯了a=b=c的代码方式。今天才发现其中也有玄机。
模仿STL的list写了一个list的迭代器
其中的插入方法如下:
Iterator insert(iterator itr, const Object &x)
{
ListNode* p= itr.current;
ListNode* newnd = new ListNode(x, p->prev, p); //创建一个新的节点,参数分表为:节点数据、上一个节点、下一个节点
p->prev->next = newnd;
p->prev = newnd;
return iterator(newnd);
}
我将此段代码简化后为:
Iterator insert(iterator itr, const Object &x)
{
ListNode* p= itr.current;
return iterator(p->prev->next = p->prev = new ListNode(x, p->prev, p) );
}
执行结果错误。
分析后才发现,a=b=c的代码,分解后是b=c;a=c ,导致以上错误出现。
正确代码应该是:
Iterator insert(iterator itr, const Object &x)
{
ListNode* p= itr.current;
return iterator(p->prev = p->prev->next = new ListNode(x, p->prev, p) );
}