何时何地应该重载 - > *运算符?

时间:2013-04-12 13:36:44

标签: c++ operator-overloading

我是C ++的新手,并且学习它,在学习运算符重载的同时,我知道我们也可以重载->*,在什么情况下我们需要它?

3 个答案:

答案 0 :(得分:1)

C ++运算符重载是一个非常有用且非常强大的功能,但它也很容易被滥用而导致灾难性的结果。

经验法则是遵循毫不奇怪的原则。也就是说,运算符重载的语义应该与内置版本的语义相匹配。 (是的,有一些例外,例如特定于域的语言,boost :: spirit等,但这些都是孤立的事务。)

我们将其应用于->*。通常可以使用指针作为左操作数和指向成员的指针作为右操作数来调用此运算符。因此,您只应在要模拟此类语义的情况下重载它。假设你正在创建一个类似指针的类,可能是一个句柄或一个特殊的智能指针(当std中的那些不适用于你的情况时)。您可能希望为您的类重载->*,以使其尽可能多地使用常规指针。

示例:

template <typename T>
class LoggingPointer
{
  T *ptr_;
  std::ostream &log_;

public:
  T& operator* () const {
    log_ << "Deref";
    return *ptr_;
  }

  T* operator-> () const {
    log_ << "Access";
    return ptr_;
  }

  template <typename Mem>
  Mem& operator->* (Mem T::*arg) const {
    log_ << "Member access";
    return ptr_->*arg;
  }
};

答案 1 :(得分:0)

我们使用->*运算符的地方就是我们操作方法指针的时候。

由于方法必须知道她被调用的对象,我们可以这样做:

class     A
{
    public:
          int    some_integer;

          void   add_then_print(int value)
          {
                  this->some_integer = this->some_integer + value;
                  std::cout << "My integer now: " << this->some_integer;
          }
};

typedef void    (A::*method_pointer)(int);
int    main(void)
{
    A*                   my_first_class_a = new A;
    A*                   my_second_class_a = new A;
    method_pointer       method = &A::add_then_print;         

    (my_first_class_a->*(method))(10);
    (my_second_class_a->*(method))(12);
    return 0;
}

在这种情况下,您可以看到add_then_print方法已保存到method

但是为了知道thisadd_then_print代表什么,当我们使用方法指针调用方法时,语法如下: (object->*(method_pointer))(parameters_to_the_method);

在某些情况下,您可能希望重载此运算符以执行其他操作,而不是仅使用给定参数或任何您想要的调用它。

答案 2 :(得分:0)

这可能不是您正在寻找的答案,但唯一需要它的情况是混淆项目中其他任何人的地狱。这包括你两周后的事情。所以请不要。并非所有可能做到的事情都是实际实施的好主意。