当迭代指针的向量(或其他容器)时,使用和/或使用advantage有什么不同:
for (it = v.begin(); it != v.end(); ++it) {
(*it)->method();
}或
for (it = v.begin(); it != v.end(); ++it) {
(**it).method();
}发布于 2012-11-09 03:08:46
在C语言中,这是没有区别的。但是,在C++中,可以重载->运算符,而不能重载成员选择.运算符。
因此,在(*foo)->bar中,*foo可以指定一个充当智能指针的类对象,但如果foo是标准C++指针容器上的迭代器,则不会发生这种情况,这意味着*foo的计算结果是指针。
在(**foo).bar中,**foo必须是一个具有名为bar (可访问)的成员的类对象。
也可以重载一元* (这就是迭代器foo (一个类对象)返回它所引用的对象的方式)。
换句话说,表达式的含义可以不同,但如果*foo是指向类/结构的指针,则从C语言继承的等价性适用:(*ptr).member等同于ptr->member。
发布于 2012-11-09 03:35:52
它们是等价的:根据标准的定义(用于指针)
5.2.5类成员访问expr.ref
2:对于第一个选项(点),第一个表达式应具有完整的类类型。对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针。表达式E1->E2被转换为等价形式(*(E1)).E2;5.2.5的其余部分将只处理第一个选项(点).65在任何一种情况下,id表达式都应该命名该类或其基类之一的成员。
类和覆盖->和*运算符在这里不相关,因为容器包含指针。
因此:
(*it)->method();
// Is equivelent to:
(*((*it))).method();
// This is equivelent too:
(**it).method(); // thus both expressions are identical in this context.发布于 2012-11-09 03:08:17
不是的。->只是说要以指针的形式访问结构。.的行为就像它只是一个结构。它是同构的--在功能上没有区别。
编辑:你可以重载->,让它做一些不同的事情,尽管假设你不这样做,它是一样的。我不确定为什么要这样做,但是如果这样做了,那么您将不得不使用额外的*再次取消对结构的引用。
https://stackoverflow.com/questions/13295978
复制相似问题