这两个参数在C ++中有什么区别?

时间:2013-11-06 00:27:41

标签: c++ pointers

我是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

答案是“数组转换为指针,其值是数组中第一个数据的地址。”我不确定这是否相关,但它似乎是我能找到的唯一有效解释。

谢谢!

3 个答案:

答案 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}}应该小而便宜复制,因此避免复制没有收获。 (实际上,拥有本地副本可以增强引用的局部性并帮助优化,所以我只是按值传递小值(通过复制)。)