【发布时间】:2010-09-18 07:01:12
【问题描述】:
箭头运算符 (->) 的同义词是什么?
【问题讨论】:
箭头运算符 (->) 的同义词是什么?
【问题讨论】:
你可以使用->来定义一个函数。
auto fun() -> int
{
return 100;
}
这不是 lambda。这真的是一个功能。 “->”表示函数的返回类型。
【讨论】:
-> 用于访问您有指针指向的数据。
例如,您可以创建一个指向 int intVar 类型变量的指针 ptr,如下所示:
int* prt = &intVar;
然后,您可以仅通过取消引用该指针来在其上使用函数,例如 foo - 在指针指向的变量上调用函数,而不是在该变量的内存位置的数值上调用函数:
(*ptr).foo();
如果此处没有括号,编译器会将其理解为 *(ptr.foo()),因为运算符优先级不是我们想要的。
这其实和打字是一样的
ptr->foo();
由于->取消引用该指针,因此在指针指向的变量上调用函数foo()。
同样,我们可以使用-> 来访问或设置一个类的成员:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
【讨论】:
C++ 语言将箭头运算符 (->) 定义为取消引用指针的同义词,然后在该地址上使用 . 运算符。
例如:
如果您有一个对象 anObject 和一个指针 aPointer:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
为了能够使用您取消引用指针并对该地址执行方法调用的对象方法之一:
(*aPointer).method();
可以用箭头操作符来写:
aPointer->method();
箭头操作符存在的主要原因是它缩短了一个非常常见的任务的打字时间,而且它也很容易忘记指针解引用周围的括号。如果你忘记了括号,.-operator 将绑定比 *-operator 更强,并使我们的示例执行为:
*(aPointer.method()); // Not our intention!
其他一些答案也提到了 C++ 运算符可以重载并且它并不常见。
【讨论】:
new SomeClass() 返回一个指针 (SomeClass *),而不是 SomeClass 对象。你从声明anObject 和aPointer 开始,但之后你使用p。
我主要是从右到左阅读它并称之为“in”
foo->bar->baz = qux->croak
变成:
“foo 中 bar 中的 baz 变成 qux 中的 croak。”
【讨论】:
在 C++0x 中,运算符有第二个含义,表示函数或 lambda 表达式的返回类型
auto f() -> int; // "->" means "returns ..."
【讨论】:
::实际上是一个运算符,就像.或->一样,在标准中被称为“范围解析运算符”。
以下两个表达式是等价的:
a->b
(*a).b
(如 Konrad 提到的,受运算符重载的影响,但这是不寻常的)。
【讨论】:
-> 运算符,因此您不得不 使用*.。许多库对它们的定义不一致。当您使用模板并且不知道确切的类型时会变得非常烦人。
a[0].b代替(*a).b。但它的结构不会那么正确。
a->b 通常是(*a).b 的同义词。由于运算符* 和. 的绑定强度,此处的括号是必要的:*a.b 不起作用,因为. 绑定更强并且首先执行。因此这相当于*(a.b)。
但请注意重载:由于 -> 和 * 都可以重载,因此它们的含义可能会有很大的不同。
【讨论】:
binding strength 你的意思是运算符优先级?如果不是,两者有什么区别?