ptr->hello();和(*ptr).hello();有什么区别?

12
我正在学习C++指针,发现->运算符很奇怪。例如,可以使用(*ptr).hello(); 代替ptr->hello();,因为似乎两种写法都可以工作,所以我认为前者只是更方便的一种方式。
那是因为这样还是有不同之处?

英语中,“I”是大写的。 - Lightness Races in Orbit
6个回答

35

“->” 操作符只是一种语法糖,因为打 (*ptr).hello()实在太麻烦了。从汇编级别生成的指令来看,它们没有任何区别。事实上,在一些语言(比如 D 语言)中,编译器可以根据类型自动推断一切。如果你写 ptr.hello(),它也能正常工作,因为编译器知道 ptr 是一个指针并且没有 hello() 属性,因此你必须意味着 (*ptr).hello()


非常准确和有趣,我不知道D语言是这样工作的。为什么人们认为“语法糖”这个术语会让我抓狂呢? :D - xan

15

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

这意味着一个对象可能会根据你调用的语法而表现出不同的行为。


4
当然,任何以这种方式覆盖以使这些操作行为不同的人都应该被开枪处决。 - Paul Smith
operator->() 很大程度上只能在某些替代对象上调用方法(例如,制作自己的智能指针类)一元 operator*() 经常被迭代器重载(它们本质上是相同的东西),但在 PCFG 解析中也有有用的重载,例如 boost::spirit 中的 Kleene 星号。 - Ken Bloom

8

就可读性而言,最主要的优势在于需要链接函数调用,即:

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

我甚至不打算使用“*”运算符来完成这个任务。

7
唯一需要使用 '->' 运算符的原因是为了使其更加方便,并避免出现以下错误:
*ptr.hello();

因为很容易忘记括号。

5

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


0

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