我是C ++的新手,目前正在学习模板和迭代器。
我看到一些实现自定义迭代器的代码,我很想知道这两个iterator
参数之间的区别是什么:
iterator & operator=(iterator i) { ... i.someVar }
bool operator==(const iterator & i) { ... i.someVar }
它们为特定的迭代器实现了=和==运算符。假设迭代器类有一个成员变量'someVar',为什么一个运算符使用“iterator i”实现,另一个运算符使用“iterator& i”实现?两个“i.someVar”表达式之间有什么区别吗?
我用Google搜索了一下,发现了这个问题 Address of array - difference between having an ampersand and no ampersand
答案是“数组转换为指针,其值是数组中第一个数据的地址。”我不确定这是否相关,但它似乎是我能找到的唯一有效解释。
谢谢!
答案 0 :(得分:3)
operator=
按值(按副本a.k.a.)获取其参数。 operator ==
通过const引用获取其参数(a.k.a. by address,尽管保证不会修改对象)。
迭代器可能是/包含指向数组的指针,但它本身不是数组。
&符号(&
)具有不同的上下文含义。在表达式中使用时,它表现为运算符。在iterator & i
等声明中使用,它构成iterator &
类型的一部分,表示i
是一个引用,而不是一个对象。
有关更多讨论(包含图片!),请参阅Pass by Reference / Value in C++和What's the difference between passing by reference vs. passing by value?(此语言与语言无关)。
答案 1 :(得分:2)
赋值运算符=
将迭代器i作为值,这意味着创建原始迭代器的副本并将其传递给函数,以便在运算符方法中应用于迭代器i
的任何更改都将获胜不会影响原作。
比较运算符==
采用常量引用,表示原始对象不能/不应该在方法中更改。这是有道理的,因为比较运算符通常只比较对象而不改变它们。该引用允许将引用传递给位于该方法之外的原始迭代器。这意味着不会复制实际对象,这通常会更快。
答案 2 :(得分:1)
首先,这里没有数组的地址。
除非您尝试对局部变量i
进行局部更改,否则没有语义差异:iterator i
将允许本地更改,而const iterator & i
则不会。
许多人习惯于为函数参数编写const type & var
,因为通过引用传递可能比按值更快,特别是如果type
很大且复制成本高,但在您的情况下,iterator
1}}应该小而便宜复制,因此避免复制没有收获。 (实际上,拥有本地副本可以增强引用的局部性并帮助优化,所以我只是按值传递小值(通过复制)。)