【问题标题】:Pointer dereference operator ( (*) vs -> )指针解引用运算符 ( (*) vs -> )
【发布时间】:2011-05-14 21:49:27
【问题描述】:

做和做有没有一般的区别

(*ptr).method()

ptr->method()

我在对另一个问题的评论中看到了这个问题,并认为我会在这里问这个问题。虽然我只记得 C++ 中的几乎每个运算符都可以重载,但我想答案将取决于。但总的来说,做一个和另一个有区别吗?

【问题讨论】:

标签: c++ pointers operator-overloading


【解决方案1】:

C++ 标准 5.2.5/3:

如果 E1 的类型为“指向类的指针” X,” 那么表达式 E1->E2 是 转换为等价形式 (*(E1)).E2;

对于非指针值,操作符可以被重载。

【讨论】:

    【解决方案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->()->y.

    这意味着 -> 应该返回一个 dereferenceable 类型,而 * 应该返回一个 dereferenced 类型,因此这个“链接”适用仅限->

    【讨论】:

    • 我不明白你的意思吗?不同的返回类型是两个运算符的语法/位置所固有的基本真理。正如 Alf 所展示的,这并不能阻止您使用 *(ptr) 做同样的事情,如果您输入足够多的星号和括号会感到困扰。 (作为概念运算符,-> 是一个礼物;我只是希望它不要使用两个字符。)
    • 我的意思是它们的实现(和使用)略有不同,但很重要。特别是,-> 应该返回一个“指针”而不是一个“引用”可能并不直观,这个微小的区别是一个可以轻松链接而不是另一个的根本原因(链接只能发生在输入和输出的行为方式相同)。有些人(看起来像你)更喜欢实际使用差异方面的事实解释,我只是更喜欢根本原因(我自己可以从中得出事实差异)。
    • 我有点明白你的意思,但对于不同的人来说,它的直观性可能不同:鉴于 -> 覆盖了源自指针的运算符,我只期望它可以在指针上工作(而不是引用) 类型对象,对我来说是基本的。但我确信我对简单的事情感到困惑,所以任何能帮助每个人理解的东西都是好的。
    • @underscore_d 尊敬的我想你可能又错过了我的意思;这不是关于它在 on 上的工作原理,而是关于它在应用的情况下返回的内容。当然,您会期望->* 可以在指针上工作,因为这就是它在C 中的工作方式。但重要的部分是-> 预计会返回一个可解引用的类型(即行为与-> 最初应用于什么),而 * 预计会返回一个 dereferenc_ed_ 类型(这会破坏链接,这就是为什么你需要在再次使用 * 之前使用 .<something>)。
    • 我只能对我说,这种区别从这些运算符在普通类型中的使用方式和对自定义类型的规范中是显而易见的。但这只是我;如果您的解释方式有助于您或其他人理解它,那就太好了。
    【解决方案3】:

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

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

    但是,对于 内置 运算符,这两个表达式是等价的。

    -> 运算符在跟踪指针链时更方便,因为. 的优先级高于*,因此需要大量难以理解的括号。

    考虑:

    pBook->author->snailMail->zip
    

    (*(*(*pBook).author).snailMail).zip
    

    【讨论】:

      【解决方案4】:

      但总的来说,做一个和另一个有区别吗?

      不! (除非->* 被显式重载以执行不同的功能)

      ptr->method()(*ptr).method() 是等价的。

      【讨论】:

      • 这些运算符可以为类重载,然后两个表达式可以产生不同的效果。 “不!”对于内置运算符是正确的。干杯,
      • @Alf :添加了 unless 部分。 :)
      【解决方案5】:

      -> 序列用作它指向某物的视觉指示器。两个运算符执行完全相同的操作序列。

      【讨论】:

        【解决方案6】:

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

        是的,对于一般类型,答案确实是“视情况而定”,因为类可能会重载 operator*operator-> 以产生不同的行为。

        【讨论】:

        • 如果一个班级这样做,当然,你有权打作者的脸......很难。
        【解决方案7】:

        是的。 ptr->method()(*ptr).method() 短两个字符。

        它也更漂亮。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2015-09-13
            • 2010-12-27
            • 2021-06-08
            • 1970-01-01
            • 1970-01-01
            • 2012-01-23
            • 2017-02-08
            • 2012-01-30
            • 2014-01-12
            相关资源
            最近更新 更多