我可以用什么来代替箭头操作符,’->’?

箭头操作符(->)是什么的同义词?

111758 次浏览

下面两个表达式是等价的:

a->b


(*a).b

(正如康拉德提到的,受运算符重载制约,但这种情况并不常见)。

a->b通常是 (*a).b的同义词。这里的括号是必要的,因为操作符 *.: *a.b的绑定强度不会起作用,因为 .的绑定强度更大,并且首先执行。这相当于 *(a.b)

但是,要小心超载: 由于 ->*都可能超载,因此它们的含义可能大不相同。

我大多是从右往左读,然后打电话进去

foo->bar->baz = qux->croak

变成:

“巴兹在酒吧在福,成为呱呱在 Qux。“

C + + 语言将箭头操作符(->)定义为取消引用指针的同义词,然后在该地址上使用 .操作符。

例如:

如果有一个对象 anObject和一个指针 aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

为了能够使用一个对象方法,你取消引用指针,并对该地址执行一个方法调用:

(*aPointer).method();

可以用箭头操作符写出:

aPointer->method();

箭头操作符存在的主要原因是它缩短了一个非常常见的任务的类型,而且很容易忘记指针解引用周围的括号。如果你忘了括号。- 操作符将绑定得比 * 更强-操作符并使我们的示例执行为:

*(aPointer.method()); // Not our intention!

其他一些答案也提到了 C + + 操作符可能会重载,而且这种情况并不常见。

在 C + + 0x 中,操作符获得第二个含义,表示函数或 lambda 表达式的返回类型

auto f() -> int; // "->" means "returns ..."

->用于访问指针指向的数据。

例如,您可以像下面这样创建一个指向 int intVar 类型的变量的指针 ptr:

int* prt = &intVar;

然后你可以对它使用一个函数,比如 foo,只有通过解引用那个指针——对指针指向的变量调用函数,而不是对那个变量的内存位置的数值:

(*ptr).foo();

如果这里没有括号,编译器将把它理解为 *(ptr.foo()),因为操作符优先级不是我们想要的。

这实际上和打字是一样的

ptr->foo();

作为 ->dereferences 该指针,因此调用指针所指向的变量上的函数 foo()

类似地,我们可以使用 ->来访问或设置类的一个成员:

myClass* ptr = &myClassMember;
ptr->myClassVar = 2;

您可以使用-> 来定义函数。

auto fun() -> int
{
return 100;
}

它不是 lambda,它实际上是一个函数。“->”表示函数的返回类型。