指针解引用运算符((*)vs - >)

时间:2010-11-24 05:41:01

标签: c++ pointers operator-overloading

执行

之间是否存在一般差异?
(*ptr).method()

VS

ptr->method()

我在另一个问题的评论中看到了这个问题,我想在这里问一下。虽然我记得几乎C ++中的每个操作符都可以重载,所以我想答案将取决于。但总的来说,做一个与另一个之间是否存在差异?

8 个答案:

答案 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)

他们是同义词。后者是前者的简写。