2008-10-21 122 views

回答

114

下面的两个表达式是等效的:

a->b 

(*a).b 

(受运算符重载,如康拉德提到,但是这是不寻常的)。

+9

超载问题的返回类型少了很多不寻常的比你想象的。不久前,STL实现者对于某些迭代器类型没有重载的` - >`运算符,所以你*有*使用`* .`。许多图书馆对它们的定义不一致。当您使用模板并且不知道确切的类型时变得非常烦人。 – 2008-10-21 10:15:00

+0

编辑完成后,我认为你的帖子会以很好的方式召唤它。 – 2008-10-21 10:16:54

+1

你也可以做`a [0]。b`而不是`(* a).b`。但它不会像结构合理。 – 2013-06-19 03:35:11

61

a->b通常是(*a).b的同义词。括号这里是必要的,因为运营商*.*a.b的绑定强度将不起作用,因为.绑定更强,并首先执行。因此这相当于*(a.b)

但是请注意超载:由于->*都可能超载,因此它们的含义可能会有很大差异。

13

我主要是看它的权利到左,并呼吁“在”

foo->bar->baz = qux->croak 

变为:

“巴兹在FOO酒吧成为qux发牢骚。”

35

C++语言将箭头运算符(->)定义为取消引用指针的同义词,然后在该地址上使用.操作符。

例如:

如果你有一个对象,anObject和指针,aPointer

SomeClass anObject = new SomeClass(); 
SomeClass *aPointer = &anObject; 

为了能够使用的对象方法中的一种取消引用指针,并做了该地址的方法调用:

(*aPointer).method(); 

其可以与箭头操作符来写:

aPointer->method(); 

箭头运算符的existents的主要原因是它缩短了一个非常常见的任务的键入,并且它也容易忘记指针取消引用周围的括号。如果您忘记了括号中的。运营商将结合做强那么* - 运算符,让我们的例子中执行如下:

*(aPointer.method()); // Not our intention! 

其他一些答案也同时提及的是C++运算符可以过载,它不是那很普通。

14

在C++ 0x中,运营商得到了第二含义,表示函数或lambda表达式

auto f() -> int; // "->" means "returns ..." 
相关问题