【问题标题】:What is the difference between (*ptr).f() and ptr->f()? [duplicate](*ptr).f() 和 ptr->f() 有什么区别? [复制]
【发布时间】:2013-01-16 20:19:51
【问题描述】:

可能重复:
C++ - Difference between (*). and ->?

这有什么区别:

(*ptr).f();

还有这个:

ptr->f();

中,ptr 是指向具有函数f 的C++ 类的指针?

【问题讨论】:

  • 唯一的区别是编译器会将ptr->f()转换成(*ptr).f()(也就是一个快捷方式)。

标签: c++ c++ pointers


【解决方案1】:

根本没有区别。 (*ptr).f(); 是更丑陋的做法。

实际上,如果ptr 是一些智能指针,并且它的operator*operator-> 被重载并执行一些副作用,那么你可能会遇到这个问题。但这确实是非常糟糕的事情。和#define true false一样邪恶

【讨论】:

  • +1 提到您应该(几乎)永远不要以违反最小意外原则的方式定义运算符。
【解决方案2】:

如果ptr 是一个普通指针,那么两者是等价的。 ptr->f 是取消引用指针(相当于(*ptr))和访问被取消引用对象的成员(相当于.f)的捷径。

如果ptr 是一个重载operator->operator* 的类,那么它们将各自调用不同的运算符重载,因此可能具有不同的行为。

【讨论】:

    【解决方案3】:

    除了风格/打字差异之外,没有任何区别。使用指向结构或类的指针时,它与 (*ptr).member = 7;ptr->member = 7; 完全相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多