ptr->你好(); /* VERSUS */ (*ptr).hello();
Posted
技术标签:
【中文标题】ptr->你好(); /* VERSUS */ (*ptr).hello();【英文标题】:ptr->hello(); /* VERSUS */ (*ptr).hello(); 【发布时间】:2010-10-01 15:27:57 【问题描述】:我正在学习 C++ 指针,而 ->
运算符对我来说似乎很奇怪。代替
ptr->hello();
可以写(*ptr).hello();
因为它似乎也可以工作,所以我认为前者只是一种更方便的方式。
是这样还是有什么不同?
【问题讨论】:
英文“I”这个词大写。 【参考方案1】:-> 运算符只是语法糖,因为(*ptr).hello()
是要键入的 PITA。就在 ASM 级别生成的指令而言,没有区别。事实上,在某些语言中(想到 D),编译器会根据类型计算出所有内容。如果你使用ptr.hello()
,它就可以工作,因为编译器知道 ptr 是一个指针并且没有 hello() 属性,所以你的意思一定是(*ptr).hello()
。
【讨论】:
准确有趣,我不知道 D 是如何工作的。为什么人们认为语法糖这个词让我很生气? :D【参考方案2】:其他人已经回答了有关内置指针的问题。关于类,可以重载 operator->()、operator&() 和 operator*(),但不能重载 operator.()。
这意味着对象可能会根据您调用的语法而有所不同。
【讨论】:
当然,任何以这种方式覆盖以使这些操作行为不同的人都应该被枪杀。operator->()
在某些替代对象上调用方法非常有限(即创建自己的智能指针类)一元 operator*()
对于迭代器(本质上是同一件事)一直重载,但它在 PCFG 解析中也很有用,例如 boost::spirit 以指示 kleene 星。【参考方案3】:
当您必须链接函数调用时,可读性方面的主要优势就出现了,即:
ptr->getAnotherPtr()->getAThirdPtr()->print()
我什至不打算用 * 运算符来做这件事。
【讨论】:
【参考方案4】:拥有'->'
操作符的唯一原因是让它更方便并保存如下错误:
*ptr.hello();
因为很容易忘记括号。
【讨论】:
【参考方案5】:它们生成完全相同的机器代码,但对我来说,ptr->arg() 比 (*ptr).arg() 更容易阅读。
【讨论】:
【参考方案6】:这些替代语法模式是从 C 中采用的,您可能会从A Tutorial on Pointers and Arrays in C,特别是第 5 章,Pointers and Structure 中获得一些额外的理解。
【讨论】:
以上是关于ptr->你好(); /* VERSUS */ (*ptr).hello();的主要内容,如果未能解决你的问题,请参考以下文章
Expressions versus statements in JavaScript
Physical (Raw) Versus Logical Backups