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

What is the difference between these two parameters in C++?

本文关键字:C++ 什么 区别 参数 两个      更新时间:2023-10-16

我是C++新手,目前正在学习模板和迭代器。我看到了一些实现自定义迭代器的代码,我很想知道这两个iterator参数之间的区别是什么:

iterator & operator=(iterator i) { ...   i.someVar }
bool operator==(const iterator & i) { ... i.someVar }

它们为特定迭代器实现 = 和 == 运算符。假设迭代器类有一个成员变量"someVar",为什么一个运算符使用"迭代器 i"实现,另一个运算符使用"iterator & i"实现?两个"i.someVar"表达式之间有什么区别吗?

我用谷歌搜索了一下,发现了这个问题数组地址 - 有 & 符号和没有 & 符号之间的区别

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

谢谢!

operator=

值(也称为通过复制)获取其参数。 operator ==通过常量引用(也称为地址,尽管保证对象不会被修改)来获取其参数。

迭代器可以是/包含指向数组的指针,但它本身不是数组。

与号(&)有不同的上下文含义。在表达式中使用时,它的行为就像运算符一样。在声明中使用,如 iterator & i ,它构成类型 iterator & 的一部分,并指示i是引用,而不是对象。

有关更多讨论(带图片!),请参阅按引用/C++中的值传递和按引用传递与按值传递有什么区别?(这个与语言无关)。

赋值运算符=将迭代器 i 作为值,这意味着创建原始迭代器的副本并将其传递给函数,以便应用于迭代器的任何更改都不会影响原始迭代器i运算符方法。

比较运算符==采用常量引用,该引用表示原始对象不能/不应该在方法中更改。这是有道理的,因为比较运算符通常只比较对象而不更改它们。引用允许将引用传递给存在于方法外部的原始迭代器。这意味着实际对象不会被复制,这通常更快。

首先,这里没有数组的地址。

没有语义差异,除非您尝试对局部变量进行局部更改 iiterator i 将允许局部更改,而const iterator & i则不允许。

许多人习惯于为函数参数编写const type & var,因为通过引用传递可能比按值传递更快,特别是如果type很大且复制成本很高,但在您的情况下,iterator应该很小且复制成本低,因此避免复制没有任何好处。(实际上,拥有本地副本可以增强引用的位置性并帮助优化,因此我只会按值(通过复制)传递小值。