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 ++是否也知道一些解决方法?
答案 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)
};
};
如果您想要访问班级中的friend
和protected
数据(OOP中应该是这种情况),您应该只使用private
关键字。