关于operator *重载的c ++

时间:2014-02-16 18:10:12

标签: c++ operator-overloading operator-keyword

是否有任何可能的方法来重载operator *,使得它的分配和观察功能被分开定义?

class my_class
{
  private:
    int value;
  public:
    int& operator*(){return value;}
};

int main()
{
  my_class obj;
  int val = 56;

  *obj = val;   // assign
  val  = *obj;  // observe, same operator* is called
}

2 个答案:

答案 0 :(得分:1)

排序 - 您可以让运算符*返回另一个类的实例,而不是直接返回引用。然后,另一个类的实例定义转换运算符和赋值运算符。

(在您的示例代码中,当您想要重新引用解除引用操作符时,看起来您已经重载了乘法运算符;我将使用下面的解除引用运算符。)

例如:

class my_class
{
   friend class my_class_ref;

public:
   my_class_ref operator*() { return my_class_ref(this); }

private:
   int value;
};

class my_class_ref
{
public:
   operator int() { return owner->value; } // "observe"
   my_class_ref& operator=(int new_value) { owner->value = new_value; return *this; } // "assign"

private:
   my_class* owner;

   my_class_ref(my_class* owner) { this->owner = owner; }
};

有一些警告。例如,由于my_class_ref是使用指向其父类的指针实现的,因此您的代码必须注意my_class_ref的生命周期始终短于相应my_class的生命周期 - 否则您将取消引用无效指针。

实际上,如果你假装my_class_ref不存在(即从不用该类声明变量),它可以很好地工作。

答案 1 :(得分:0)

像这样写你的课

class my_class
{
  private:
    int value;
  public:
    int operator*() const { // observing
        return value;
    }
    int& operator*() { // assigning
        return value;
    }
};

然后这些运算符被constness消除歧义,所以这样的代码是可能的

int _tmain(int argc, _TCHAR* argv[])
{
    my_class a;
    *a = 1; // assigning 
    int k = *(const_cast<my_class const&>(a)); // observing
    return 0;
}