You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用解引用加.运算符和->运算符访问类成员有区别吗

问题解答

核心结论

  • 对于你示例中的原生指针场景,obj->foo和(*obj).foo完全等价,前者就是后者官方定义的语法糖,不存在任何行为差异
  • 两种写法都不会触发MyObject的拷贝构造函数,你之前的猜测不成立

详细说明

1. 原生指针的标准规则

C++标准明确规定,针对原生指针类型,a->b的语义等价于(*a).b。两者在编译后生成的机器指令完全一致,没有性能区别,也不会产生额外的对象副本。

这里需要明确解引用操作的行为:对指针obj执行*obj操作得到的是MyObject&类型的左值引用,指向的就是指针指向的原对象,不会生成新的对象实例,因此不会调用拷贝构造函数。只有当你把解引用的结果赋值给一个值类型变量时,才会触发拷贝,例如:

MyObject copy = *obj; // 这时候才会调用拷贝构造
(*obj).foo; // 仅访问成员,无拷贝
obj->foo; // 完全等同于上面的写法,无拷贝

2. 唯一例外场景

如果obj不是原生指针,而是自定义的、重载了operator->和operator*的类(比如智能指针、迭代器),那两者的行为可能存在差异,具体取决于运算符的实现逻辑。但你给出的示例中obj是明确的MyObject*原生指针,不涉及这个例外场景。


内容的提问来源于stack exchange,提问作者David Callanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:48:02