>如果我有类矩形
Class rectangle{
//attribute
....
//methods
...
void getInfo() const;
}
和主要
int main(){
vector<Rectangle> v;
for (vector<Rectangle>::const_iterator it = v.begin() ; it != v.end(); ++it){
it->getInfo();
}
}
为什么
"it->getInfo();"
返回有关所有矢量内容的正确值,并且
"*it->getInfo();"
返回错误?
我了解到迭代器就像指针......对于获取它的内容,你应该尊重它。
为什么
"it->getInfo((;"
返回有关所有矢量内容的正确值
it
是一个迭代器。 可以取消引用迭代器以访问它引用的项,并且operator*
和operator->
都是取消引用迭代器的可接受方法。it->getInfo()
与(*it).getInfo()
相同。
和
"*it->getInfo((;">
返回错误?
operator->
的优先级高于operator*
,所以上面的表达式被计算为好像它被写成*(it->getInfo())
,这失败了,因为getInfo()
不返回可以用operator*
取消引用的类型。
即使编译器以另一种方式对其进行评估,(*it)->getInfo()
也会失败,因为rectangle
没有重载operator->
。
我了解到迭代器就像指针一样。
喜欢指针,但不保证是指针。 所有指针都是迭代器,但并非所有迭代器都是指针。
it->getInfo();
是正确的,因为; 迭代器和 -> 正在取消引用它。
*it->getInfo(); incorrect
(*it).getINfo();
简而言之,-> 是 (*it(.getINfo(( 的快捷方式;在写作方面,最好阅读。
有两种方法可以取消引用指针,一种是通过*
,另一种是通过->
,其中后者必须后跟与点的静态类型关联的数据成员或成员函数。例:
void doStuff(const Rectangle&);
Rectangle rect{/* ... */};
Rectangle *pointer = ▭
doStuff(*pointer); // dereference the pointer
const double width = pointer->width(); // dereference and use a width() member function
这同样适用于迭代器,其中这些运算符是重载的。在您的情况下,
it->getInfo();
//^^ dereference the iterator
通过operator ->
取消引用,而*it->getInfo()
尝试取消引用getInfo()
的返回类型,即void
。顺便说一下,getInfo()
返回void
的成员函数是一个令人困惑的名称,您可能会想太多。让我在这里插入第二个建议:循环可以通过基于范围的 for 循环来简化,如下所示:
for (const Rectangle& rect : v) {
rect.getInfo();
}
请注意,循环变量rect
是一个const
限定引用,不再是迭代器 - 因此,无需取消引用任何内容。