C++中的“->”运算符是什么意思?

4

请问在C++中"->"是什么意思?

如果有例子的话,会更加易懂。

谢谢。


2
+1 我不知道为什么人们要给你点踩。这是一个基本问题,但又怎样呢?这并不代表它不好。 - Scott Stafford
1
这是一个简单的问题,但在网络上搜索这样的字符非常困难。你可能会从一本好书中受益,点击此处 - johnsyweb
4
没错,这是一个基础问题。但是只要查看任何一本关于C++或C的书籍就能很容易地回答这个问题。谷歌并不是人们应该做的唯一研究。 - Nicol Bolas
3个回答

9

这是一种解除引用并进行属性访问(或方法调用)的快捷方式。

在代码中,以下是一些等效的示例:

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;

这样会方便得多。以下是一段真实代码的代码片段,给定一个指向资源描述符(rd)的指针,它获取托管资源的服务器的友好名称:rd->resource->GetServer()->GetFriendlyName()GetServer函数返回托管资源的服务器的指针。resource是资源描述符结构的成员。想象一下如果使用 (*). 的形式会有多丑陋。 - David Schwartz
与 C++ 中的几乎所有运算符一样,您应该补充说明 *-> 都可以被重载,因此 (*a).ba->b 虽然通常相同,但除非 a 是指针,否则不能保证等效。 - PeterT

7
通常称之为“成员访问”运算符。基本上,a->b 是一种更好的方式来写作 (*a).b。你可以将 a->b 理解为“访问对象 a 指向的b 成员/函数”。你可以大声朗读它(或者自己想想),作为“a 成员访问 b”。
在我刚刚检查的结构化 C++ 代码的一个随机样本中(来自不同人编写的几个不同项目),有10% 的代码行(不包括头文件)包含至少一个成员访问运算符。

1
你的回答中明显缺少“指针”一词的提及。是的,operator->可以被重载,但即使如此,这只是为了模拟指针的对象而做的。 - Nicol Bolas
@NicolBolas 通常情况下(也就是几乎总是),您会在指针本身或者类似指针的实例上使用成员访问对象。我说它访问“对象a指向的”。 - David Schwartz
是的,你说了那句话,但接着你又说可以将其读作"a成员访问b"。如果a是一个裸指针,那么这是不可能的,因为指针实际上没有成员。应该是"a解引用,然后成员访问b"。而且,如果不涉及指针,"解引用"也没有意义。 - Nicol Bolas
指针没有成员,但指针所访问的内容有成员。因此这是一个“成员访问”操作。(也就是说,它允许您访问一个成员。) - David Schwartz

3
-> 运算符通常用于指针(或类似指针的对象)作为LHS,结构体或类成员作为RHS(lhs->rhs)。它通常等同于(*lhs).rhs,这是访问成员的另一种方式。如果您忽略德米特定律并需要编写lhs->mid->rhs,则更方便(通常比(*(*lhs).mid).rhs更容易阅读)。
您可以重载->运算符,智能指针经常这样做。据我所知,您无法重载.运算符。

你是正确的,不能被重载(连同.*::'?:)。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接