首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(*it)->method() vs (**it).method

(*it)->method() vs (**it).method
EN

Stack Overflow用户
提问于 2012-11-09 03:05:55
回答 5查看 299关注 0票数 7

当迭代指针的向量(或其他容器)时,使用和/或使用advantage有什么不同:

代码语言:javascript
复制
for (it = v.begin(); it != v.end(); ++it) {
    (*it)->method();
}

代码语言:javascript
复制
for (it = v.begin(); it != v.end(); ++it) {
    (**it).method();
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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

票数 10
EN

Stack Overflow用户

发布于 2012-11-09 03:35:52

它们是等价的:根据标准的定义(用于指针)

5.2.5类成员访问expr.ref

2:对于第一个选项(点),第一个表达式应具有完整的类类型。对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针。表达式E1->E2被转换为等价形式(*(E1)).E2;5.2.5的其余部分将只处理第一个选项(点).65在任何一种情况下,id表达式都应该命名该类或其基类之一的成员。

类和覆盖->和*运算符在这里不相关,因为容器包含指针。

因此:

代码语言:javascript
复制
(*it)->method();

// Is equivelent to:

(*((*it))).method();

// This is equivelent too:

(**it).method(); // thus both expressions are identical in this context.
票数 3
EN

Stack Overflow用户

发布于 2012-11-09 03:08:17

不是的。->只是说要以指针的形式访问结构。.的行为就像它只是一个结构。它是同构的--在功能上没有区别。

编辑:你可以重载->,让它做一些不同的事情,尽管假设你不这样做,它是一样的。我不确定为什么要这样做,但是如果这样做了,那么您将不得不使用额外的*再次取消对结构的引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13295978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档