当我有一个指针时,例如:
所以我可以使用。
MyClass * pRags = new MyClass;
所以我可以使用。
pRags->foo()
或者
(*pRags).foo()
调用foo。
为什么这两个是相同的?而 *pRags 是什么?
谢谢。
MyClass * pRags = new MyClass;
pRags->foo()
或者
(*pRags).foo()
调用foo。
为什么这两个是相同的?而 *pRags 是什么?
谢谢。
->
是根据内置的 *
和 .
来定义的。*pRags
?pRags
指向的 MyClass
对象。 *
对指针进行解引用,得到指向的对象。(*(*(*car).engine).flux_capacitor).init()
vs
car->engine->flux_capacitor->init()
pRags->foo()
被定义为语法糖,相当于(*pRags).foo()
。
*
操作符解引用一个指针。也就是说,它表示你正在操作指针所指向的内容,而不是指针本身。
->
只是一种方便的写法,等同于(*).
,而*pRags
则是存储在pRags
地址中的对象。->
被包含在 C 中(因此被继承到 C++)作为一种符号上的便利。*
用于解除指针引用。一元运算符 *
被称为解引用操作符。对指针进行解引用会将 T*
转换为 T&
;对对象进行解引用会调用该对象类型的一元运算符 operator*
,如果定义了该运算符,则在该对象值上调用它,否则会出现错误。
T&
吗?转换为对T
的引用?还是返回实际值?我不确定是否有区别,除了T&
始终有效,而T *
可能指向NULL
,因此无效。 - Nathan FellmanT
的引用,而不是T
值;否则,*pdouble = 4.2;
将无法工作,因为它将尝试将一个值分配给rvalue。解引用NULL
指针的行为会调用未定义的行为,但我不明白这与此有何关系。 - ildjarn*
会产生指向对象地址的左值。在C++中,我们称之为引用。;-] - ildjarn(*pRags)
通过指针 pRags
获取整个对象,因此您可以使用常规的点符号 .
。
pRags是MyClass类型的指针。就像您可以拥有原始数据类型的指针,例如int ptr,您也可以拥有指向对象的指针,在这种情况下由pRags表示。现在,使用箭头运算符(->)访问对象“成员”,或者您可以使用“。”和取消引用“*”来访问对象的成员值。这里的成员是MyClass内部的变量。因此,foo()将在MyClass中具有定义。
(*(*(*car).engine).flux_capacitor).init()
。 - Martin York