箭头运算符(
->
)是什么意思?它的同义词是什么?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();
*(aPointer.method()); // Not our intention!
new SomeClass()
返回一个指针(SomeClass *
),而不是 SomeClass
对象。你开始声明了 anObject
和 aPointer
,但后面却使用了 p
。 - musiphilauto f() -> int; // "->" means "returns ..."
::
实际上是一个操作符,就像.
或->
一样,在标准中被称为“作用域解析运算符”。 - musiphil我大多数情况下从右向左阅读并称之为“in”
foo->bar->baz = qux->croak
"foo 中的 bar 中的 baz 变成了 qux 中的 croak。"
->
用于访问您拥有指针的数据。
例如,您可以像这样创建指向类型为int intVar的变量的指针ptr:
int* prt = &intVar;
(*ptr).foo();
如果没有括号,编译器会因为运算符优先级将其理解为*(ptr.foo())
,这不是我们想要的。
实际上,这与键入以下内容相同:
ptr->foo();
当我们使用->
解引用指针时,会自动调用指针所指变量的函数foo()
。
同样地,我们也可以使用->
来访问或设置类的成员:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
auto fun() -> int
{
return 100;
}
->
运算符,因此必须使用*.
运算符。许多库定义它们的方式不一致,在使用模板并且不知道精确类型时会变得非常烦人。 - Konrad Rudolpha[0].b
代替(*a).b
。但这样不够结构化。 - Sellorio