代码之家  ›  专栏  ›  技术社区  ›  Falmarri

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

  •  34
  • Falmarri  · 技术社区  · 15 年前

    做这件事有什么区别吗

    (*ptr).method()
    

    ptr->method()
    

    我在对另一个问题的评论中看到了这个问题,我想我会在这里提出这个问题。虽然我刚想起,C++中的每一个操作符都可以被重载,所以我猜答案将取决于。但总的来说,两者之间有区别吗?

    8 回复  |  直到 9 年前
        1
  •  62
  •   Alex Paul Becotte    13 年前

    正如“jamesdlin”已经指出的那样 * -> 可以为类类型重载运算符。

    然后这两个表达式 (*ptr).method() ptr->method() 会有不同的效果。

    然而,对于 内置 这两个表达式是等价的。

    这个 -> 在跟踪指针链时,运算符更方便,因为 . 优先级高于 * ,因此需要很多不可破解的括号。

    考虑:

    pBook->author->snailMail->zip
    

    (*(*(*pBook).author).snailMail).zip
    
        2
  •  12
  •   jamesdlin    15 年前

    对于原始指针类型,它们是等效的。

    是的,对于一般类型,答案确实是“这取决于”,因为类可能会重载 operator* operator-> 有不同的行为。

        3
  •  10
  •   wrongusername    15 年前

    对。 ptr->method() 两个字符短于 (*ptr).method() .

    它也更漂亮。

        4
  •  8
  •   Jakub Arnold    11 年前

    C++标准5.2.5/3:

    如果E1具有指向类的类型指针 X,则表达式E1->E2是 转换为等效形式 (*(E1)).E2;

    对于非指针值,可以重载运算符。

        5
  •  5
  •   Prasoon Saurav    15 年前

    但总的来说,两者之间有区别吗?

    不!(除非 -> * 显式重载以执行不同的函数)

    ptr->method() (*ptr).method() 相当于。

        6
  •  2
  •   Jonathan H    12 年前

    很抱歉挖掘这个帖子,但是尽管OP中的表达式相当于原始指针类型,但我认为除了C++中的所有内容外,还有至少一个重要的区别:

    来自维基百科( http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6 ):

    运算符->()的返回类型必须是-> 可以应用操作,例如指针类型。如果x是C型 其中C重载运算符->(),x->y扩展为 x.运算符->(->y)。

    这意味着 -> 预计将返回 可解引用 类型,然而 * 预计将返回 被间接引用的 类型,因此此“链接”适用于 -> 只有。

        7
  •  1
  •   AK.    15 年前

    这个 -> 序列作为一个视觉指示器,它指向某个东西。两个运算符执行完全相同的操作序列。

        8
  •  0
  •   Alex Budovski    15 年前

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