箭头操作符(->
)是什么的同义词?
答案 0 :(得分:126)
以下两个表达式是等效的:
a->b
(*a).b
(受操作员超载影响,正如Konrad所提到的那样,但那是不寻常的)。
答案 1 :(得分:66)
a->b
通常是(*a).b
的同义词。这里的括号是必要的,因为运算符*
和.
的绑定强度:*a.b
不起作用,因为.
绑定更强并且首先执行。因此,这相当于*(a.b)
。
请注意重载:由于->
和*
都可以重载,因此它们的含义会大不相同。
答案 2 :(得分:41)
C ++语言将箭头运算符(->
)定义为解引用指针的同义词,然后在该地址上使用.
- 运算符。
例如:
如果您有一个对象anObject
和一个指针aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
为了能够使用其中一个对象方法,您可以取消引用指针并对该地址执行方法调用:
(*aPointer).method();
可以使用箭头操作符编写:
aPointer->method();
箭头操作符存在的主要原因是它缩短了一个非常常见的任务的类型,并且很容易忘记指针解除引用周围的括号。如果你忘记了括号,.-运算符将绑定更强大的* -operator并使我们的示例执行为:
*(aPointer.method()); // Not our intention!
其他一些答案也提到C ++运算符都可以重载并且不常见。
答案 3 :(得分:15)
在C ++ 0x中,运算符获得第二个含义,表示函数或lambda表达式的返回类型
auto f() -> int; // "->" means "returns ..."
答案 4 :(得分:13)
我大多从右到左阅读并打电话给“in”
foo->bar->baz = qux->croak
变为:
“foo中的baz变成了qux中的呱呱叫。”
答案 5 :(得分:0)
->
用于访问您有指针的数据。
例如,您可以像这样创建一个指向int intVar类型变量的指针ptr:
int* prt = &intVar;
然后只能通过取消引用该指针在其上使用函数,例如foo,以在指针指向的变量上调用该函数,而不是对该变量的内存位置的数值进行调用:< / p>
(*ptr).foo();
这里没有括号,由于运算符优先级不是我们想要的,因此编译器会将其理解为*(ptr.foo())
。
这实际上与输入相同
ptr->foo();
由于->
取消了该指针的引用,因此在指针为我们指向的变量上调用函数foo()
。
类似地,我们可以使用->
来访问或设置类的成员:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
答案 6 :(得分:0)
您可以使用->定义函数。
.prop('hidden', ... )
这不是lambda。这确实是一个功能。 “->”表示函数的返回类型。