我正在学习 C++ 指针,而->
操作符对我来说似乎很奇怪。而不是
ptr->hello();
一个可以写(*ptr).hello();
,因为它似乎也可以工作,所以我认为前者只是一种更方便的方式。
是这样还是有什么不同?
我正在学习 C++ 指针,而->
操作符对我来说似乎很奇怪。而不是
ptr->hello();
一个可以写(*ptr).hello();
,因为它似乎也可以工作,所以我认为前者只是一种更方便的方式。
是这样还是有什么不同?
-> 运算符只是语法糖,因为(*ptr).hello()
它是要键入的 PITA。就在 ASM 级别生成的指令而言,没有区别。事实上,在某些语言中(想到 D),编译器会根据类型计算出所有内容。如果你这样做ptr.hello()
,它就可以工作,因为编译器知道 ptr 是一个指针并且没有 hello() 属性,所以你必须是(*ptr).hello()
.
其他人已经回答了有关内置指针的问题。关于类,可以重载 operator->()、operator&()和 operator*(),但不能重载 operator.()。
这意味着对象可能会根据您调用的语法而有所不同。
当您必须链接函数调用时,可读性方面的主要优势就出现了,即:
ptr->getAnotherPtr()->getAThirdPtr()->print()
我什至不会费心用 * 运算符来做这件事。
拥有操作员的唯一原因'->'
是使其更方便并保存错误,例如:
*ptr.hello();
因为很容易忘记括号。
它们生成完全相同的机器代码,但对我来说,ptr->arg() 比 (*ptr).arg() 更容易阅读。
这些替代语法模式是从 C 中采用的,您可能会从A Tutorial on Pointers and Arrays in C 中获得一些额外的理解,特别是第 5 章,指针和结构。