重载<<和>>在C ++中执行十进制移位

时间:2013-04-18 13:16:55

标签: c++

我正在尝试重载<<和>>运算符执行十进制移位,但我没有看到如何做到这一点。例如,我将拥有类myclass

的成员函数
myclass myclass::operator<<(myclass ob2)
{
    //Code in here for overloading <<
    //In the object, there is a float value to perform the shift on
}

任何帮助将不胜感激!感谢!!!

3 个答案:

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