ptr->你好(); / * VERSUS * /(* ptr)。hello();

时间:2009-01-15 16:47:20

标签: c++ operators pointers dereference

我正在学习C ++指针,而->运算符对我来说似乎很奇怪。代替 ptr->hello();可以写(*ptr).hello();因为它似乎也有效,所以我认为前者只是一种更方便的方式。

是这样的情况还是有什么不同?

6 个答案:

答案 0 :(得分:35)

- >运算符只是语法糖因为(*ptr).hello()是要键入的PITA。就ASM级别生成的指令而言,没有区别。实际上,在某些语言中(D会想到),编译器会根据类型计算出所有内容。如果你执行ptr.hello(),它就可以工作,因为编译器知道ptr是一个指针并且没有hello()属性,所以你必须指(*ptr).hello()

答案 1 :(得分:15)

其他人已经回答了关于内置指针的问题。关于类,可以重载operator->(),operator&()和operator *()但不重载operator。()。

这意味着对象可能会根据您调用的语法采取不同的行为。

答案 2 :(得分:8)

可读性方面的主要优势在于您必须进行链接函数调用,即:

ptr->getAnotherPtr()->getAThirdPtr()->print()

我甚至不打算用*运算符来做这件事。

答案 3 :(得分:7)

拥有'->'运算符的唯一理由是使其更方便并保存错误,如:

*ptr.hello();

因为很容易忘记括号。

答案 4 :(得分:5)

它们生成相同的机器代码,但对我来说,ptr-> arg()比(* ptr).arg()更容易阅读。

答案 5 :(得分:0)

这些替代语法模式是从C中采用的,您可以从A Tutorial on Pointers and Arrays in C获得一些额外的理解,特别是第5章Pointers and Structure