是否可以覆盖左撇子操作员?

时间:2014-11-22 15:44:17

标签: c++ operator-overloading

C ++中是否有覆盖和左手操作符的可能性?

例如,很容易覆盖右手:例如:

class MyClass{
  public inline MyClass operator*(float &other)
  {
     return MyClass(this->Data * other);
  }
};

所以我可以使用类似的东西:

MyClass a = MyClass(...) * 0.4f;

怎么做,如果有人想写:

MyClass a = 0.4f* MyClass();

在C#sharp中,这很容易完成,因为存在类扩展。 C ++是否也知道一些解决方法?

3 个答案:

答案 0 :(得分:2)

MyClass a = 0.4f* MyClass();
MyClass a = MyClass(...) * 0.4f;

为了使这些有意义声明operator *作为类的非成员函数以及单个参数构造函数。

答案 1 :(得分:2)

是的,您可以将运算符重载声明为自由函数。在您的情况下,由于操作的两个排序具有相同的含义,您可以将一个委托给另一个:

class MyClass
{
    float data_;

public:
    explicit MyClass(float data) : data_(data) { }   // exposition only

    MyClass operator*(float val) const { return MyClass(data_ * val); }
};

MyClass operator*(float val, MyClass const & x) { return x * val; }

现在当你有MyClass x;而你说x * 4时,这会使用成员重载,但当你说4 * x时,它会使用free函数,而free函数又调用成员函数

请注意,通过委托给相反的运算符,我们可以拥有一个简单的自由函数,它不需要知道成员函数的实现。相比之下,如果你想从头开始重新实现自由函数,它需要访问类的私有成员,这通常通过将自由函数设为friend来解决,如下所示:

class MyClass
{
    // as above

    friend MyClass operator*(float val, MyClass const & x)
    {
        return MyClass(x.data_ * val);   // access x's private member
    }
};

答案 2 :(得分:1)

您可以将类成员函数视为:

ReturnType Function(TypeOfThisClass* this_, TypeOfParam param, ...)

( 您也可以在std::thread中使用此表单:(即将类ptr作为参数传递)

class MyClass { void Function() { ; }; }
....
MyClass myClass;
std::thread(&MyClass::Function, &myClass);

所以你的成员是:

class MyClass{
  ....
  friend MyClass operator*(const MyClass& this_, float &other)
  {
     return MyClass(this_.Data * other);
  };

  /*or MyClass operator*(float &other)
  {
     return MyClass(this->Data * other);
  };, which is the same, except you use it with reference not pointer)*/

  friend MyClass operator*(float &other, const MyClass& this_)
  {
     return this_ * other; //you can use the overloaded op. since it is defined above (first arg is class)
  };
};

如果您想要访问班级中的friendprotected数据(OOP中应该是这种情况),您应该只使用private关键字。