我正在尝试重载<<和>>运算符执行十进制移位,但我没有看到如何做到这一点。例如,我将拥有类myclass
的成员函数myclass myclass::operator<<(myclass ob2)
{
//Code in here for overloading <<
//In the object, there is a float value to perform the shift on
}
任何帮助将不胜感激!感谢!!!
答案 0 :(得分:4)
一般情况下,我建议您保留<<
非变异,并使用<<=
来更改值。
此外,除非无法设置/获取班级的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';
}
答案 1 :(得分:3)
你可能想要这个:
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;
}
答案 2 :(得分:2)
大概是“十进制移位”意味着将小数点左移(右移,operator>>
)指定的位数。
在这种情况下,您可能希望参数为unsigned int:
myclass &myclass::operator<<(unsigned digits) {
value *= pow(10, digits);
return *this;
}