-> 和 之间的区别。对于成员选择运算符 [重复]
Posted
技术标签:
【中文标题】-> 和 之间的区别。对于成员选择运算符 [重复]【英文标题】:difference between -> and . for member selection operator [duplicate] 【发布时间】:2011-03-02 10:52:29 【问题描述】:可能重复:what is the difference between (.) dot operator and (->) arrow in c++
在这本书中,我正在学习指针,我刚刚完成了关于 OOP(吐在地上)的章节,它告诉我我可以使用这样的成员选择运算符( -> )。它说这就像“。”除了指向对象而不是成员对象。有什么区别,好像用的一样……
【问题讨论】:
what is the difference between (.) dot operator and (->) arrow in c++(和其他)的副本 如果 E1 的类型为“指向类 X 的指针”,则表达式E1->E2
将转换为等效形式 (*(E1)).E2
。换句话说,->
只是“取消引用和访问”的快捷方式。
【参考方案1】:
地点:
Foo foo;
Foo* pfoo = &foo;
pfoo->mem
在语义上与(*pfoo).mem
相同。
或者,换一种说法:foo.mem
在语义上与(&foo)->mem
相同。
【讨论】:
语义相同。如果它是相同的标记序列,它将在语法上相同:)foo.mem
=== (*(&foo)).mem
:-)
这间接令人困惑,因为您的示例中的一些 foo 是指针,而其他的是对象。
我解决了所有迂腐的嘘声吗?
不完全是:operator->
和一元 operator*
和 operator&
可以重载,但 operator.
不能。因此,仅当 pfoo
是指针时,您的等价性才必然成立。支持您陈述的表达式的其他类型可能会或可能不会将运算符实现为等效。你确实问过;-)【参考方案2】:
是的,它实际上做了同样的事情,只是针对不同类型的变量。
如果你有一个指针,你必须使用->
,而如果你有一个真正的值,你将使用.
。
例如
struct mystruct *pointer;
struct mystruct var;
pointer->field = ...
var.field = ...
这一点都不难。请记住,如果有指针,则需要->
,否则需要.
。
【讨论】:
非常感谢。我是这么想的,但我现在的想法是布丁。因此,如果该行中有一个指针,请使用 -> 或者使用 .【参考方案3】:只有在变量是指向对象的指针时才使用 ->:
A* a = new A;
a->member();
使用“。”当它不是指针时:
A a;
a.member();
【讨论】:
【参考方案4】: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
【讨论】:
【参考方案5】:当您拥有一个对象实例 (MyObject object;
) 时,您可以使用 .
来访问它的成员(方法、属性、字段等),例如:object.Member
。
当您有一个指向对象实例的指针 (MyObject* pObject = new MyObject();
) 时,您需要取消对指针的引用,然后才能访问对象成员。要取消引用指针,请使用 *
运算符。因此,当你将两者结合起来时,你会得到这样的结果:(*pObject).Member
。
当然,这是不可读的,所以编译器将->
作为它的简写。因此,它变成了pObject->Member
。
【讨论】:
【参考方案6】:也许这个例子会有所帮助
object o;
object *p = &o; // pointer to object
o.member; // access member
p->member; // access member through pointer
【讨论】:
【参考方案7】:你使用->
取消引用指针,当你通过指针访问成员时,你使用.
直接访问成员。
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();
【讨论】:
以上是关于-> 和 之间的区别。对于成员选择运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
python基础语法常用内置函数关键字方法和之间的区别(小结)
C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?
对于初学者来说,MySQL和PostgreSQL之间是不是有很大区别[关闭]