成员选择运算符中 -> 和 . 的区别

3

可能重复问题:
C++中点运算符(.)和箭头运算符(->)有什么区别?

我正在学习指针,刚刚完成了关于面向对象编程的章节(吐口水)。它告诉我可以使用成员选择运算符 (->),它类似于 ".",只是指向对象而不是成员对象。它们有什么区别,看起来使用方式相同...


4
C++中的点运算符(.)和箭头运算符(->)有什么区别?(以及其他相关问题) - James McNellis
如果E1的类型为“指向类X的指针”,那么表达式E1->E2将被转换为等效形式(*(E1)).E2。换句话说,->只是“取值并访问”的快捷方式。 - GManNickG
7个回答

8

地点:

Foo foo;
Foo* pfoo = &foo;

pfoo->mem 的语义与 (*pfoo).mem 相同。

换句话说: foo.mem 的语义相当于 (&foo)->mem


5
语义上完全相同。如果它是相同的标记序列,它将在语法上完全相同 :) - Pavel Minaev
1
foo.mem 相当于 (*(&foo)).mem :-) - Franci Penov
这会间接造成困惑,因为你的例子中有些foos是指针,另一些则是对象。 - James McNellis
1
我修复了所有啰嗦的小错误了吗? - greyfade
1
不完全正确:operator->和一元operator*operator&可以被重载,但是operator.不能。因此,只有当pfoo是指针时,您的等式才必然成立。支持您所述表达式的其他类型可能会或可能不会实现运算符以达到等效。您确实提出了问题;-) - Steve Jessop
显示剩余2条评论

6

是的,它实际上执行相同的操作,但针对不同类型的变量。

如果您有一个指针,您必须使用->,而如果您有一个实际值,则将使用.

因此,例如:

struct mystruct *pointer;
struct mystruct var;

pointer->field = ...
var.field = ...

那并不难。只要记住使用指针时需要用->,否则使用.即可。

非常感谢。我也是这么想的,但现在我的头脑有些混乱。所以如果这行代码里有指针,请使用->,否则请使用.。 - TimothyTech

5

只有当变量是指向你的对象的指针时,才使用->:

A* a = new A;
a->member();

当它不是指针时使用 ".":

A a;
a.member();

1
struct S
{
    int a, b;
};

S st;
S* pst = &st;
st.a = 1;    // . takes an object (or reference to one)
pst->b = 2;  // -> takes a pointer

1

当你有一个对象实例 (MyObject object;),你使用 . 来访问它的成员 (方法、属性、字段等),像这样:object.Member

当你有一个指向对象实例的指针 (MyObject* pObject = new MyObject();),你需要在访问对象成员之前对指针进行解引用。要解引用指针,你使用 * 运算符。因此,当你将两者结合起来时,就会得到类似于这样的东西:(*pObject).Member

当然,这不容易阅读,所以编译器将 -> 视为其简写形式。因此,它变成了 pObject->Member


0

或许这个例子能帮到你

object o;
object *p = &o;  // pointer to object
o.member;   // access member
p->member;  // access member through pointer

0
您在使用指针解引用时使用 ->,当您通过指针访问成员时,使用. 直接访问成员。
class A
{
   public:
   int x;
   void g() {};
};

A a;
a.x
a.g();

A * ap = new A();
ap->x;
ap->g();

你可以解引用指针,然后使用.

(*ap).x;
(*ap).g();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接