我试图重载 << 和 >> 运算符以执行小数移位,但我不知道如何做到这一点。例如,我将有一个类 myclass 的成员函数
myclass myclass::operator<<(myclass ob2)
{
//Code in here for overloading <<
//In the object, there is a float value to perform the shift on
}
任何帮助将不胜感激!谢谢!!!
我试图重载 << 和 >> 运算符以执行小数移位,但我不知道如何做到这一点。例如,我将有一个类 myclass 的成员函数
myclass myclass::operator<<(myclass ob2)
{
//Code in here for overloading <<
//In the object, there is a float value to perform the shift on
}
任何帮助将不胜感激!谢谢!!!
一般来说,我建议您保留<<
非变异,并使用<<=
原地更改值。
此外,除非无法设置/获取您的类的float
/double
成员,否则无需使操作符成为类成员。
struct myclass {
double value;
};
// mutate in-place: take the instance by non-const reference,
// and return a reference to the same instance
myclass& operator<<=(myclass &self, unsigned places) {
self.value *= std::pow(10, places);
return self;
}
myclass& operator>>=(myclass &self, unsigned places) {
self.value /= std::pow(10, places);
return self;
}
// create a new instance and return it by value
myclass operator<<(myclass const &original, unsigned places) {
myclass temp(original);
temp <<= places;
return temp;
}
myclass operator>>(myclass const &original, unsigned places) {
myclass temp(original);
temp >>= places;
return temp;
}
并使用如下:
int main() {
myclass a = {0.1};
std::cout << "a := " << a.value << '\n';
myclass b = a << 1;
std::cout << "b = (a << 1) := " << b.value << '\n';
b >>= 1;
std::cout << "b >>= 1 := " << b.value << '\n';
}
你可能想要这个:
myclass myclass::operator<<(int digits) const {
myclass result;
result.value = this->value * pow(10, digits);
return result;
}
myclass myclass::operator>>(int digits) const {
myclass result;
result.value = this->value * pow(0.1, digits);
return result;
}
这确保它this
没有改变,所以你必须写
number = number << 3;
修改一个数字,所以写的时候
otherNumber = number << 3;
number
正如您在对该问题的评论中所要求的那样,这保持不变。签名中的const
告诉使用此运算符的代码左侧操作数保持不变。
通常,您还有直接对目标对象进行操作的运算符,这些运算符也包含=
在其中。从技术上讲,它们与其对应的非赋值运算符无关,因此您应该相应地定义它们以保持一致性:
myclass & myclass::operator<<=(int digits) {
this->value *= pow(10, digits);
return *this;
}
myclass & myclass::operator>>=(int digits) {
this->value *= pow(0.1, digits);
return *this;
}
据推测,“小数移位”意味着将小数点左移(右,for operator>>
)指定的位数。
在这种情况下,您可能希望参数是无符号整数:
myclass &myclass::operator<<(unsigned digits) {
value *= pow(10, digits);
return *this;
}