C++ 取消引用和使用点运算符与使用箭头运算符之间有区别吗

Dav*_*nan 2 c++ dereference

假设我有以下变量:

MyObject* obj = ...;
Run Code Online (Sandbox Code Playgroud)

如果此对象具有字段foo,则有两种访问方式:

  1. obj->foo
  2. (*obj).foo

使用一种方法与另一种方法之间是否有任何区别。或者第一种方法只是第二种方法的语法糖?

我在想也许第一个可能会导致对象的复制构造函数被调用,因为它现在持有该值。

Kev*_*vin 8

obj是指针时没有区别。

如果obj是一些类的对象,obj->foo将调用operator->()(*obj).foo将调用operator*()。理论上你可以重载这些来做完全不同的行为,但这将是一个设计得很糟糕的类。


And*_*zel 6

根据ISO C++20 标准的 \xc2\xa77.6.1.5 \xc2\xb62,将表达式obj->foo转换为(*obj).foo. 所以它只是语法糖。两者是等价的。

\n
\n

我在想也许第一个可能会导致调用对象的复制构造函数,因为它现在保留了该值。

\n
\n

不会调用构造函数,因为没有创建新对象。

\n