重载成员访问运算符有什么用?

时间:2012-11-18 13:23:27

标签: c++ operator-overloading member-access

  

可能重复:
  Operator overloading

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

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

3 个答案:

答案 0 :(得分:3)

成员访问运算符是一个有点奇怪的生物:它意味着返回一个指针或类,其中成员访问运算符被重载。一旦到达指针,它就会访问相应的成员。重载成员访问运算符的主要用途是智能指针,例如std::shared_ptr<T>std::unique_ptr<T>。没有这个操作符,你需要使用像

这样的东西
sp.get()->member

(*sp).member

而不是

sp->member

答案 1 :(得分:1)

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

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

这通常用于允许类型在语法上行为 - 如果它们是原始指针(具有一些语义差异),如Y等。如果没有这种语言支持,则无法实现这一点,因为如果没有shared_ptr允许模仿规范shared_ptr<X>运算符,则X*shared_ptr<X>::operator->无法以相同的方式使用适用于->(但不是X*)。

答案 2 :(得分:0)

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