在 C++ 中。 (*a).b 和 a->b 有啥区别? [复制]

Posted

技术标签:

【中文标题】在 C++ 中。 (*a).b 和 a->b 有啥区别? [复制]【英文标题】:In C++. whats the difference between (*a).b and a->b? [duplicate]在 C++ 中。 (*a).b 和 a->b 有什么区别? [复制] 【发布时间】:2020-04-02 08:55:07 【问题描述】:

我在工作中的高级编程课程中学习 C++,因为到目前为止我只使用过 Web 和 .NET 语言。 在中途测试中,讲师将我对 (*a).b 的所有使用都标记为错误并扣分,这可能会对我的最终分数产生负面影响,我需要一个接近完美的分数才能将工作从 Web 堆栈过渡到应用程序stack,那么你们中的一些人可以帮我解决这个纠纷吗?

【问题讨论】:

请提供一个例子并尽可能具体。 它们是等价的; “->”只是语法糖 它们是等价的,但是当您将箭头作为更复杂表达式的一部分时,它就不那么难看了。这可能就是你的导师不希望你做(*a).b 的原因。最后,代码质量不仅包括代码做它应该做的事情,还包括它的可维护性和易于理解。 显然, (*a).b 在所有情况下都是正确的(几乎参见昆汀的回答),因此您可以争辩说扣分是不合理的。实际上,我更喜欢 a->b,因为它更简洁。 【参考方案1】:

如果a是一个指针,那么在功能上完全没有区别,实际上一个用另一个[expr.ref§2]表示:

表达式E1->E2被转换为等价形式(*(E1)).E2; [expr.ref] 的其余部分将仅处理第一个选项(点)。

如果a 是具有重载运算符*-> 的类的实例,则可能有所不同。但是这样的差异会令人惊讶,因此我认为 class 存在错误。

最后,一切都与约定和可读性有关。 -> 运算符作为 */. 对的简写存在,因为它更短并且具有更好的优先规则(不需要括号)。因此,确实会使用它而不是*/.

【讨论】:

unique_ptr 带有自定义删除器也可能有不同的行为,* 总是引用存储的类型,但 -> 可能会给出自定义类 @M.M 这……太奇怪了。 @M.M 没有提到 here @AlanBirtles 看operator->的返回类型

以上是关于在 C++ 中。 (*a).b 和 a->b 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PAT算法题C++实现(Basic)1022 D进制的A+B

在发布版本中使用英特尔 c++ 编译时出现“cin >> a >> b”编译错误

C++ 语法“A::B:A ;”是啥意思?意思是

c++ 中直接输入char型数据只能是个位数字 例如 char a,b,c; cin>>a>>b>>c;

在C++中,a=4,b=10,c=2 计算:a+b*c/(a+c)%3/a 的最后结果 顺便把运算符的优先级告诉哈我 谢谢

C++ 虚拟方法未按预期调用