执行
之间是否存在一般差异?(*ptr).method()
VS
ptr->method()
我在另一个问题的评论中看到了这个问题,我想在这里问一下。虽然我记得几乎C ++中的每个操作符都可以重载,所以我想答案将取决于。但总的来说,做一个与另一个之间是否存在差异?
答案 0 :(得分:59)
正如“jamesdlin”已经指出的那样,*
和->
运算符可以为类类型重载。
然后两个表达式(*ptr).method()
和ptr->method()
会有不同的效果。
但是,对于内置运算符,这两个表达式是等效的。
当您跟踪指针链时,->
运算符更方便,因为.
的优先级高于*
,因此需要大量不可忽略的括号。
考虑:
pBook->author->snailMail->zip
与
(*(*(*pBook).author).snailMail).zip
答案 1 :(得分:12)
对于原始指针类型,它们是等价的。
是的,对于一般类型,答案确实是“它取决于”,因为类可能会使operator*
和operator->
超载以使其具有不同的行为。
答案 2 :(得分:10)
是。 ptr->method()
比(*ptr).method()
短两个字符。
它也更漂亮。
答案 3 :(得分:8)
C ++标准5.2.5 / 3:
如果E1具有“指向类的指针”类型 X,“那么表达式E1-> E2是 转换为等效形式 (*(E1))E2;
对于非指针值,运算符可能会过载。
答案 4 :(得分:5)
但总的来说,做一个与另一个有区别吗?
没有! (除非显式重载->
和*
以执行不同的功能)
ptr->method()
和(*ptr).method()
是等效的。
答案 5 :(得分:2)
很抱歉挖掘这篇文章,但即使OP中的表达式与原始指针类型相同,我认为除了已经说过的所有内容之外,在C ++中至少有一个重要的区别:
来自维基百科(http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):
operator->()的返回类型必须是 - >的类型。 可以应用操作,例如指针类型。如果x是C类型 其中C重载operator->(),x-> y扩展为 x.operator->() - >ÿ
这意味着->
预计会返回可解除引用的类型,而*
则会返回解除引用的类型,因此"链"仅适用于->
。
答案 6 :(得分:1)
->
序列用作指向某事物的视觉指示符。两个运营商都执行完全相同的操作序列。
答案 7 :(得分:0)
他们是同义词。后者是前者的简写。