重载运算符C ++时的优先级

时间:2015-01-29 17:13:07

标签: c++ operators overloading operator-precedence

我有一个班级,我已经重载了一些运算符。我的代码是这样的:

myClass << 12 << 14 << 21 << 44

效果很好,首先运行myClass << 12,然后运行myClass << 14

但如果我尝试这样做,我会遇到问题:

myClass << 12 << 14+18 << 36 << 14 << 47

运算符+也被重载,问题是14+18myClass << 12之前运行。我真的需要先执行myClass << 12然后14+18。我怎样才能做到这一点?

编辑:

我想将一些数字和数组放入流中。数字的一部分得到了解决。至于数字数组,我做的是这样的事情:

myClass << 12 << myClass(array,10) << 21 << 19

如果运算符()被重载,则array是数字数组,10是数组的长度。我这样做是因为我需要某种方法来保持数组的长度,但问题是myClass(array,10)myClass << 12之前执行。所以,在这种情况下,我首先要将12放入流中,然后放入我的数组,我需要知道它的长度。

而且,我不想使用这个解决方案:

myClass << 12
myClass << myClass(array,10)

因为我想将我的代码用作库,所以我的意图是最终用户可以灵活地在一行中编写所有内容。

2 个答案:

答案 0 :(得分:2)

好的,让我们简化并分解这里发生的事情。通话的第一部分评估为:

myClass << 12 << myClass(array,10)变为myClass.operator<<(12).operator<<(myClass(array, 12),当理论上拼写出隐含的this参数时,会变成operator<<(operator<<(myClass, 12), myClass(array, 10))

现在,标准对执行operator<<(myClass, 12)myClass(array, 10)的顺序所说的唯一内容是两者都将在最外面的operator<<被调用之前执行。在您的情况下,它选择首先执行operator()

现在,我们如何实现您想要的结果?首先,您可以将单个语句的部分放入多个语句中以强制执行所需的顺序。

或者,您可以完全不同地处理数组。我建议format_array函数:

std::string format_array(array, 10)
{
    // Do stuff
    return string representation of array
}

myClass << 12 << format_array(array,10) << 21 << 19

基于不同问题的原始答案措辞: 因为你不能超载operator+(int, int)我的心理问题阅读技巧告诉我你的班级有operator<<operator+,而operator+是某种状态您的类上的操作符,您希望在将12和14插入到流中后发生。

在那种情况下.... 不要那样做。这不是operator+的原因,也不是标准流使用操纵器的原因。

但如果你绝对坚持:(myClass << 12 << 14) +18 << 36 << 14 << 47

答案 1 :(得分:0)

您遇到了sequence points的问题。如果要以保证顺序运行插入,则必须使用

myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;