繁体   English   中英

关于运算符*重载的C ++

[英]c++ about operator* overloading

是否有任何可能的方式可以重载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
}

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

(在示例代码中,当您打算重载解引用运算符时,似乎已经重载了乘法运算符;我将在下面使用解引用运算符。)

例如:

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不存在(即永远不要在该类中声明变量),则可以很好地工作。

像这样写你的课

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM