Answers:
以下两个表达式是等效的:
a->b
(*a).b
(正如Konrad所提到的,操作符会过载,但这是不寻常的)。
a[0].b
代替(*a).b
。但是它的结构不那么恰当。
a->b
通常是的同义词(*a).b
。由于运算符的绑定强度,此处的括号是必需的,*
并且.
::绑定更牢固且首先执行,因此: *a.b
无效.
。因此,这等效于*(a.b)
。
但是,请提防重载:由于->
和*
都可以重载,因此它们的含义可能会大不相同。
binding strength
你的意思是运算符优先级?如果不是,两者之间有什么区别?
C ++语言将箭头运算符(->
)定义为取消引用指针的同义词,然后.
在该地址上使用-operator。
例如:
如果有一个对象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
。
在C ++ 0x中,运算符具有第二个含义,表示函数或lambda表达式的返回类型
auto f() -> int; // "->" means "returns ..."
::
实际上是一个运算符,例如.
或->
,在标准中称为“范围分辨率运算符”。
->
在访问您有指针的数据时使用。
例如,您可以创建一个指针ptr来指向类型为int intVar的变量,如下所示:
int* prt = &intVar;
然后,仅可以通过取消引用该指针,在其上使用一个函数(例如foo),以在指针指向的变量上调用该函数,而不是在该变量的内存位置的数值上调用该函数:
(*ptr).foo();
如果没有括号,编译器将理解为*(ptr.foo())
由于运算符优先级,这不是我们想要的。
这实际上与键入相同
ptr->foo();
由于->
取消了对该指针的引用,因此调用foo()
了指针指向我们的变量上的函数。
类似地,我们可以->
用来访问或设置类的成员:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->
某些迭代器类型的重载运算符,因此您必须使用*.
。许多库对它们的定义不一致。当您使用模板并且不知道确切的类型时,它会变得非常烦人。