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
相关产品推荐
相关产品推荐

