在 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++ 中直接输入char型数据只能是个位数字 例如 char a,b,c; cin>>a>>b>>c;
在C++中,a=4,b=10,c=2 计算:a+b*c/(a+c)%3/a 的最后结果 顺便把运算符的优先级告诉哈我 谢谢