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

Strong AI Versus Weak AI

Laravel 和无限卷轴

SysML Value Properties versus UML Attributes

将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>