这两个参数在C++有什么区别
What is the difference between these two parameters in C++?
我是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
运算符方法。
比较运算符==
采用常量引用,该引用表示原始对象不能/不应该在方法中更改。这是有道理的,因为比较运算符通常只比较对象而不更改它们。引用允许将引用传递给存在于方法外部的原始迭代器。这意味着实际对象不会被复制,这通常更快。
首先,这里没有数组的地址。
没有语义差异,除非您尝试对局部变量进行局部更改 i
:iterator i
将允许局部更改,而const iterator & i
则不允许。
许多人习惯于为函数参数编写const type & var
,因为通过引用传递可能比按值传递更快,特别是如果type
很大且复制成本很高,但在您的情况下,iterator
应该很小且复制成本低,因此避免复制没有任何好处。(实际上,拥有本地副本可以增强引用的位置性并帮助优化,因此我只会按值(通过复制)传递小值。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用