C++问题:关于*和->的用法

3
当我有一个指针时,例如:
MyClass * pRags = new MyClass;

所以我可以使用。
pRags->foo()

或者

(*pRags).foo()

调用foo。

为什么这两个是相同的?而 *pRags 是什么?

谢谢。

8个回答

5
为什么这两个是相同的?
它们是等价的,因为规范说明它们是等价的。内置的 -> 是根据内置的 *. 来定义的。
什么是 *pRags
它是由 pRags 指向的 MyClass 对象。 * 对指针进行解引用,得到指向的对象。
如需了解更多信息,请考虑阅读 一本好的C++入门书籍

5
除了其他回答之外,'->'的存在是为了方便。每次访问类变量或函数时解引用对象指针非常丑陋、不方便且可能更加令人困惑。
例如:
(*(*(*car).engine).flux_capacitor).init()

vs

car->engine->flux_capacitor->init()

我喜欢这个例子。它确实阐明了这个快捷方式的原因 - Nathan Fellman
1
你把第一个例子搞错了。(*(*(*car).engine).flux_capacitor).init() - Martin York

4

pRags->foo()被定义为语法糖,相当于(*pRags).foo()

*操作符解引用一个指针。也就是说,它表示你正在操作指针所指向的内容,而不是指针本身。


2
->只是一种方便的写法,等同于(*).,而*pRags则是存储在pRags地址中的对象。

1
  • 是的,它们是相同的。 -> 被包含在 C 中(因此被继承到 C++)作为一种符号上的便利。
  • 在那个上下文中,* 用于解除指针引用。

问题是它们为什么是相同的。 - Nathan Fellman

1

一元运算符 * 被称为解引用操作符。对指针进行解引用会将 T* 转换为 T&;对对象进行解引用会调用该对象类型的一元运算符 operator*,如果定义了该运算符,则在该对象值上调用它,否则会出现错误。


它会将其转换为T&吗?转换为对T引用?还是返回实际值?我不确定是否有区别,除了T&始终有效,而T *可能指向NULL,因此无效。 - Nathan Fellman
@Nathan Fellman:是的,它会变成对T的引用,而不是T值;否则,*pdouble = 4.2;将无法工作,因为它将尝试将一个值分配给rvalue。解引用NULL指针的行为会调用未定义的行为,但我不明白这与此有何关系。 - ildjarn
感谢澄清。然而,考虑到它在C中的工作方式相同,并且C没有引用,我不确定你是正确的。在C中,您也可以将其用作lvalue。 - Nathan Fellman
在C语言中,一元运算符*会产生指向对象地址的左值。在C++中,我们称之为引用。;-] - ildjarn

1

(*pRags) 通过指针 pRags 获取整个对象,因此您可以使用常规的点符号 .


1

pRags是MyClass类型的指针。就像您可以拥有原始数据类型的指针,例如int ptr,您也可以拥有指向对象的指针,在这种情况下由pRags表示。现在,使用箭头运算符(->)访问对象“成员”,或者您可以使用“。”和取消引用“*”来访问对象的成员值。这里的成员是MyClass内部的变量。因此,foo()将在MyClass中具有定义。


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