箭头操作符(->)是什么的同义词?
->
下面两个表达式是等价的:
a->b (*a).b
(正如康拉德提到的,受运算符重载制约,但这种情况并不常见)。
a->b通常是 (*a).b的同义词。这里的括号是必要的,因为操作符 *和 .: *a.b的绑定强度不会起作用,因为 .的绑定强度更大,并且首先执行。这相当于 *(a.b)。
a->b
(*a).b
*
.
*a.b
*(a.b)
但是,要小心超载: 由于 ->和 *都可能超载,因此它们的含义可能大不相同。
我大多是从右往左读,然后打电话进去
foo->bar->baz = qux->croak
变成:
“巴兹在酒吧在福,成为呱呱在 Qux。“
C + + 语言将箭头操作符(->)定义为取消引用指针的同义词,然后在该地址上使用 .操作符。
例如:
如果有一个对象 anObject和一个指针 aPointer:
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())
这实际上和打字是一样的
ptr->foo();
作为 ->dereferences 该指针,因此调用指针所指向的变量上的函数 foo()。
foo()
类似地,我们可以使用 ->来访问或设置类的一个成员:
myClass* ptr = &myClassMember; ptr->myClassVar = 2;
您可以使用-> 来定义函数。
auto fun() -> int { return 100; }
它不是 lambda,它实际上是一个函数。“->”表示函数的返回类型。