箭头运算符 ( ->
) 的同义词是什么?
7 回答
以下两个表达式是等价的:
a->b
(*a).b
(如 Konrad 所提到的,受运算符重载的影响,但这是不寻常的)。
a->b
一般是 的同义词(*a).b
。这里的括号是必要的,因为运算符的绑定强度*
和.
: *a.b
不起作用,因为.
绑定更强并且首先执行。因此这等价于*(a.b)
。
但是要小心重载:由于两者->
和*
都可以重载,它们的含义可能会有很大的不同。
C++ 语言将箭头运算符 ( ->
) 定义为取消引用指针的同义词,然后.
在该地址上使用 - 运算符。
例如:
如果你有一个对象,anObject
和一个指针,aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
为了能够使用您取消引用指针并对该地址执行方法调用的对象方法之一:
(*aPointer).method();
可以用箭头运算符编写:
aPointer->method();
箭头操作符存在的主要原因是它缩短了一个非常常见的任务的打字时间,而且它也很容易忘记指针解引用周围的括号。如果您忘记了括号,.-operator 将绑定比 *-operator 更强,并使我们的示例执行为:
*(aPointer.method()); // Not our intention!
其他一些答案也提到了 C++ 运算符可以重载并且它并不常见。
在 C++0x 中,运算符有第二个含义,表示函数或 lambda 表达式的返回类型
auto f() -> int; // "->" means "returns ..."
我主要是从右到左阅读并调用“in”
foo->bar->baz = qux->croak
变成:
“在 foo 中的 bar 中的 baz 在 qux 中变成了呱呱。”
->
在访问您有指针的数据时使用。
例如,您可以创建一个指向 int intVar 类型变量的指针 ptr,如下所示:
int* prt = &intVar;
然后,您可以仅通过取消引用该指针来在其上使用函数,例如 foo - 以在指针指向的变量上调用函数,而不是在该变量的内存位置的数值上调用函数:
(*ptr).foo();
如果没有括号,编译器会理解为*(ptr.foo())
运算符优先级,这不是我们想要的。
这实际上和打字一样
ptr->foo();
由于->
取消引用该指针,因此调用foo()
指针为我们指向的变量上的函数。
同样,我们可以使用->
来访问或设置一个类的成员:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
您可以使用 -> 来定义一个函数。
auto fun() -> int
{
return 100;
}
它不是一个 lambda。这真的是一个功能。“->”表示函数的返回类型。