我可以使用什么代替箭头操作符,` - >`?

P-A*_*P-A 103 c++ pointers

什么是箭头operator(->)的同义词?

Gre*_*ill 134

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

a->b

(*a).b
Run Code Online (Sandbox Code Playgroud)

(受操作员超载影响,正如Konrad所提到的那样,但那是不寻常的).

  • 重载问题比您想象的要少得多.不久前,STL实现者没有为某些迭代器类型重载` - >`运算符,因此你*使用**.`.许多库不一致地定义它们.当您使用模板并且不知道精确类型时,变得非常烦人. (9认同)
  • 男孩,经过多年的 c# 编程,回到 c++ 不仅在认知上很费力,c++ 语法也很丑陋和令人讨厌。用完感觉想洗个澡。用 c 和 c++ 编写的程序只会鼓励糟糕的编程。Unix 之前的 Apple 努力使这种语言变得像 Pascal 一样漂亮。 (4认同)
  • 您还可以执行“a[0].b”而不是“(*a).b”。但它的结构不会那么正确。 (2认同)
  • @TimSeguine 如果您想查看漂亮的代码,请查看 Macintosh 内部的文档。我认为他们发明了驼峰命名法。非常具有描述性的变量名称和格式优雅​​的代码。他们设法使后来的 C 代码几乎与早期的 Pascal 代码一样华丽。 (2认同)

Kon*_*lph 69

a->b通常是一个同义词(*a).b.这里的括号是必要的,因为运算符的绑定强度*.: *a.b不会起作用,因为.绑定更强并且首先执行.这相当于*(a.b).

当心超载,但:由于两个->*可以被重载,它们的含义可以大大不同.

  • “绑定强度”是指运算符优先级?如果不是,两者有什么区别? (2认同)
  • @Vizkrig是的,这两个术语可以互换使用(尽管“运算符优先级”似乎更频繁,至少在最近几年)。 (2认同)

P-A*_*P-A 44

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

例如:

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

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
Run Code Online (Sandbox Code Playgroud)

为了能够使用其中一个对象方法,您可以取消引用指针并对该地址执行方法调用:

(*aPointer).method();
Run Code Online (Sandbox Code Playgroud)

哪个可以用箭头操作符写:

aPointer->method();
Run Code Online (Sandbox Code Playgroud)

箭头操作符存在的主要原因是它缩短了一个非常常见的任务的类型,并且很容易忘记指针解除引用周围的括号.如果忘记括号,.-运算符将绑定更强大的*-operator并使我们的示例执行为:

*(aPointer.method()); // Not our intention!
Run Code Online (Sandbox Code Playgroud)

其他一些答案也提到了C++运算符都可以重载并且它并不常见.

  • `new SomeClass()`返回一个指针(`SomeClass*`),而不是`SomeClass`对象.然后你开始声明`anObject`和`aPointer`,但之后你正在使用`p`. (8认同)

Joh*_*itb 16

C++ 0x中,操作员得到一个第二含义,指示功能或lambda表达式的返回类型

auto f() -> int; // "->" means "returns ..."
Run Code Online (Sandbox Code Playgroud)

  • @Martin大多数人使用"运算符"这个词来表示许多不直接用于计算值的东西.喜欢"::"("范围运算符").我完全不知道标准的观点是什么.在抽象意义上,可以将" - >"视为将函数序列(参数)映射到返回类型的函数运算符,如haskell运算符,也写为" - >". (6认同)
  • 我投降!:-P (6认同)
  • @ JohannesSchaub-litb:`::`实际上是一个运算符,如`.`或` - >`,在标准中称为"范围解析运算符". (2认同)

Tet*_*tha 13

我大多从右到左阅读它并打电话给"in"

foo->bar->baz = qux->croak
Run Code Online (Sandbox Code Playgroud)

变为:

"在foo酒吧里的巴兹变成了qux中的呱呱叫."