1

可能重复:
运算符重载

成员访问运算符 -> 可以重载以返回指向数据成员或其他变量的指针。

这个功能在哪里使用?它解决了哪些编码问题,或者,它使什么变得更容易?

4

3 回答 3

4

成员访问运算符是一个有点奇怪的生物:它旨在返回一个指针或一个重载成员访问运算符的类。一旦它到达一个指针,它就会访问相应的成员。重载成员访问运算符的主要用途是智能指针,例如std::shared_ptr<T>std::unique_ptr<T>。如果没有此运算符,您将需要使用类似的东西

sp.get()->member

或者

(*sp).member

代替

sp->member
于 2012-11-18T13:34:20.347 回答
1

请注意,“覆盖”和“重载”这两个术语都具有很大的误导性。规范->运算符访问通过指针引用的对象的成员,即X* x; x->foo;访问指针类型(或更准确地说是原始指针)指向的对象。x

但是,operator->您可以在聚合类型(即“类”)中将其实现为非静态成员函数会做一些不同的事情。In X* x; x->foo;,->仍然规范结构运算符,不能更改。但是, inY y; y->foo->调用 的operator->成员函数Y。这个看似很小的区别至关重要,因为一个运算符只能应用于原始指针类型,而另一个只能应用于非指针类型。

这通常用于允许类型在语法上表现得好像它们是原始指针(有一些语义差异),就像在shared_ptret al. 如果没有这种语言支持,这是无法实现的,shared_ptr<X>并且如果不允许模仿适用于(但不是)的规范运算符,则X*无法以相同的方式使用。shared_ptr<X>::operator->->X*X

于 2012-11-18T13:38:53.170 回答
0

当您对指针进行建模时,为了方便起见,您希望保持通常的语法。看看 std::unique_ptr 和 std::shared_ptr。:)

于 2012-11-18T13:34:33.063 回答