可能重复问题:
C++中点运算符(.)和箭头运算符(->)有什么区别?
我正在学习指针,刚刚完成了关于面向对象编程的章节(吐口水)。它告诉我可以使用成员选择运算符 (->),它类似于 ".",只是指向对象而不是成员对象。它们有什么区别,看起来使用方式相同...
可能重复问题:
C++中点运算符(.)和箭头运算符(->)有什么区别?
我正在学习指针,刚刚完成了关于面向对象编程的章节(吐口水)。它告诉我可以使用成员选择运算符 (->),它类似于 ".",只是指向对象而不是成员对象。它们有什么区别,看起来使用方式相同...
地点:
Foo foo;
Foo* pfoo = &foo;
pfoo->mem
的语义与 (*pfoo).mem
相同。
换句话说: foo.mem
的语义相当于 (&foo)->mem
。
operator->
和一元operator*
和operator&
可以被重载,但是operator.
不能。因此,只有当pfoo
是指针时,您的等式才必然成立。支持您所述表达式的其他类型可能会或可能不会实现运算符以达到等效。您确实提出了问题;-) - Steve Jessop是的,它实际上执行相同的操作,但针对不同类型的变量。
如果您有一个指针,您必须使用->
,而如果您有一个实际值,则将使用.
。
因此,例如:
struct mystruct *pointer;
struct mystruct var;
pointer->field = ...
var.field = ...
->
,否则使用.
即可。只有当变量是指向你的对象的指针时,才使用->:
A* a = new A;
a->member();
当它不是指针时使用 ".":
A a;
a.member();
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
当你有一个对象实例 (MyObject object;
),你使用 .
来访问它的成员 (方法、属性、字段等),像这样:object.Member
。
当你有一个指向对象实例的指针 (MyObject* pObject = new MyObject();
),你需要在访问对象成员之前对指针进行解引用。要解引用指针,你使用 *
运算符。因此,当你将两者结合起来时,就会得到类似于这样的东西:(*pObject).Member
。
当然,这不容易阅读,所以编译器将 ->
视为其简写形式。因此,它变成了 pObject->Member
。
或许这个例子能帮到你
object o;
object *p = &o; // pointer to object
o.member; // access member
p->member; // access member through pointer
->
,当您通过指针访问成员时,使用.
直接访问成员。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();
E1->E2
将被转换为等效形式(*(E1)).E2
。换句话说,->
只是“取值并访问”的快捷方式。 - GManNickG