为什么重载operator->()有用?

时间:2011-03-07 23:25:01

标签: c++ operator-overloading

我在C ++编程语言书中看到了以下示例

class Ptr {
     X* operator->( );
};

 voide f(Ptr p)
 {
   p->m=7;
   X* q1 = p->;
   X* q2 = p.operator->();
 }

这本书声称 1)类Ptr的对象可以用于以与指针使用方式非常类似的方式访问类X的成员。 2)将对象p转换为指针p.operator->()不依赖于指向的成员m。这就是operator->()是一元后缀运算符的意义。

首先,我不明白为什么我们需要这种设计,或者在哪种情况下应该使用这种设计。 对于第二点,我对作者想要传达的信息感到困惑。

感谢。

4 个答案:

答案 0 :(得分:5)

当实现行为类似于(伪装成)指针的对象时,此运算符会过载。

一个很好的例子是boost::shared_ptr,它是一个经典的引用计数指针,当所有指针都被销毁时它会自动删除指向的对象。由于种种原因,人们已经实施了无数其他类似的“智能指针”对象。

(并且,正如所指出的那样,stl迭代器也使用它来表现得像指针一样,允许像it->method();it->data;这样的语法

答案 1 :(得分:3)

  1. 当我们想要创建一个行为像指针的类时,这个设计非常有用;这是smart pointers的情况(具有类似指针的接口但提供额外“服务”的对象,例如销毁时的自动释放,所有权转移,引用计数......)。

    请注意,通常这种对象也会重载*(取消引用)运算符,以更接近地模仿指针。

  2. 作者想说,当您在->上使用Ptr运算符时,它与您之后的内容无关(就operator->而言):在任何情况下,都会调用operator->方法,它将返回一个指向对象的指针,该对象将被考虑用于表达式的其余部分。


  3. 为了更清楚地说明:直接引用标准:

      

    13.5.6班级成员访问

         

    operator->应该是不带参数的非静态成员函数。它使用->

    实现类成员访问
    postfix-expression -> id-expression
    
         

    如果x->m存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m将被解释为xT类对象T::operator->()通过重载解析机制匹配函数(13.3)。

    换句话说:

    • 如果直接调用operator->()(OP代码中的第二个和第三个示例),您将获得operator->方法返回的指针,就像任何方法一样;
    • 如果你把东西放在->运算符之后(例如x->m,就像OP代码中的第一个例子一样),将调用重载的operator->,返回的指针将会被用作好像->m被用在它上面。

答案 2 :(得分:2)

迭代器 ...... C++ standard library的基本部分。

std::list<std::string> list_of_string
std::list<std::string>::iterator i;
for(i = list_of_string.begin(); i != list_of_string.end(); ++i)
{
  //WHERE -> IS OVERLOADED...
  printf("%s\n", i->c_str()); //print to the screen, printf() is C and requires a C-string.
}

通常,i应被视为std::list<>对象,而不是std::string。通常c_str()也无法访问,没有 - &gt;超载。

答案 3 :(得分:1)

它允许创建智能指针。 (与正常指针一样的小物体)

主要原因是自动内存管理。但也可用于代理

之类的东西