12

我正在学习 C++ 指针,而->操作符对我来说似乎很奇怪。而不是 ptr->hello();一个可以写(*ptr).hello();,因为它似乎也可以工作,所以我认为前者只是一种更方便的方式。

是这样还是有什么不同?

4

6 回答 6

35

-> 运算符只是语法糖,因为(*ptr).hello()它是要键入的 PITA。就在 ASM 级别生成的指令而言,没有区别。事实上,在某些语言中(想到 D),编译器会根据类型计算出所有内容。如果你这样做ptr.hello(),它就可以工作,因为编译器知道 ptr 是一个指针并且没有 hello() 属性,所以你必须是(*ptr).hello().

于 2009-01-15T16:49:50.577 回答
15

其他人已经回答了有关内置指针的问题。关于类,可以重载 operator->()、operator&()和 operator*(),但不能重载 operator.()。

这意味着对象可能会根据您调用的语法而有所不同。

于 2009-01-15T18:37:03.543 回答
8

当您必须链接函数调用时,可读性方面的主要优势就出现了,即:

ptr->getAnotherPtr()->getAThirdPtr()->print()

我什至不会费心用 * 运算符来做这件事。

于 2009-01-15T17:18:05.700 回答
7

拥有操作员的唯一原因'->'是使其更方便并保存错误,例如:

*ptr.hello();

因为很容易忘记括号。

于 2009-01-15T16:51:32.273 回答
5

它们生成完全相同的机器代码,但对我来说,ptr->arg() 比 (*ptr).arg() 更容易阅读。

于 2009-01-15T16:51:21.137 回答
0

这些替代语法模式是从 C 中采用的,您可能会从A Tutorial on Pointers and Arrays in C 中获得一些额外的理解,特别是第 5 章,指针和结构

于 2009-01-15T17:02:23.717 回答