【问题标题】:What does the "->" operator mean in C++?C++ 中的“->”运算符是什么意思?
【发布时间】:2012-03-03 23:43:32
【问题描述】:

有人可以向我解释一下“->”在 C++ 中的含义吗?

如果可以的话,他们可以帮助我更好地理解。 谢谢。

【问题讨论】:

  • +1 我不知道为什么人们不赞成你。这是一个基本问题,但那又怎样?这并没有使事情变得糟糕。
  • +1:这是一个简单的问题,但是很难在网络上搜索这些字符。不过,您可能会从 a good book 中受益。
  • 没错,这是一个基本问题。但这也是一个可以轻松通过查看任何关于 C++ 或 C 的书籍来回答的问题。Google 并不是人们应该唯一进行的研究做。

标签: c++ pointers operator-keyword


【解决方案1】:

它通常被称为“成员访问”运算符。基本上,a->b 是写(*a).b 的更好方式。您可以将a->b 视为“访问a 指向的对象中的b 成员/函数”。您可以大声朗读(或自己思考)“a member access b”。

在我刚刚检查的结构化 C++ 代码的随机样本中(来自不同人编写的几个不同项目),10% 的代码行(不包括标头)包含至少一个成员访问运算符。

【讨论】:

  • 您的回答中明显没有提到“指针”一词。是的,operator-> 可以被重载,但即便如此,这也只是对模仿指针的对象才真正做到。
  • @NicolBolas 您通常(即几乎总是)在字面上是指针或类似指针的类的实例上使用成员访问对象。我确实说它访问“对象a 指向 to”。
  • 是的,你是这么说的,但是你说你可以把它读作“a成员访问b”。如果a 是裸指针,这是不可能的,因为指针实际上没有成员。它是“a 取消引用,然后是成员访问 b”。如果不讨论指针,“取消引用”就没有意义。
  • @NicolBolas 指针没有成员,但访问的指针有成员。因此这是一个“成员访问”操作。 (也就是说,它允许您访问成员。)
【解决方案2】:

这是取消引用后跟属性访问(或方法调用)的快捷方式。

在代码中,这里有一些这种等价的例子:

Foo *foo;

// field access
foo->bar = 10;
(*foo).bar = 10;

// method invocation
foo->baz();
(*foo).baz();

当您有很长的序列时,这尤其方便。例如,如果您有一个单链表数据结构,其中每个元素都有一个指向下一个元素的指针,那么以下是查找第五个元素的等效方法(但看起来更好):

linked_list *head, *fifth;
fifth = head->next->next->next->next;
fifth = (*(*(*(*head).next).next).next).next;

【讨论】:

  • 方便多了。这是来自一些真实代码的代码 sn-p,给定一个指向资源描述符 (rd) 的指针,它获取托管资源的服务器的友好名称:rd->resource->GetServer()->GetFriendlyName()GetServer 函数返回一个指向托管资源的服务器的指针。 resource 是资源描述符结构的成员。想一想(*). 的形式会有多难看。
  • 与 C++ 中的几乎所有运算符一样,您应该补充说明 *-> 都可以重载,因此 (*a).ba->b 虽然通常相同,但不能保证相等除非a 是一个指针。
【解决方案3】:

-> 运算符与 LHS 上的指针(或类似指针的对象)和 RHS 上的结构或类成员 (lhs->rhs) 一起使用。一般相当于(*lhs).rhs,是访问成员的另一种方式。如果忽略得墨忒耳法则,需要写lhs->mid->rhs(一般比(*(*lhs).mid).rhs更易读),会更方便。

您可以重载-> 运算符,而智能指针通常会这样做。 AFAIK 您不能重载 . 运算符。

【讨论】:

  • 你说得对,. 不能被重载(连同.*::'?:)。
猜你喜欢
  • 2010-09-15
  • 2013-06-03
  • 2011-05-12
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2011-12-11
相关资源
最近更新 更多