输出流中的函数调用优先级

问题描述 投票:3回答:2

所以,我有以下课程:

typedef double decimal;

class Ratio {
  int num, den;
  decimal val;

public:
  Ratio() { num = 1, den = 1, val = (decimal)num / den; }

  Ratio update(int a, int b) {
    num *= a, den *= b;
    val = (decimal)num / den;
    return *this;
  }

  decimal v(void) { return val; }

  friend ostream &operator<<(ostream &out, const Ratio &R) {
    return (out << R.num << ':' << R.den);
  }
};

当我在输出流中将成员函数用作:

cout<<"R = "<<R.update(2,1)<<"\tvalue = "<<R.v();

其中R是比率类型,首先调用最右端的函数,以便它显示更新的比率,但显示未更新的值:

R = 2:1    value = 1

我通过将流分成两部分来克服了这个问题:

cout<<"R = "<<R.update(2,1), cout<<"\tvalue = "<<R.v();

,以便我“强制” .update()首先被调用。仅使用一个流进行输出,还有另一种方法可以实现这一点吗?

c++ class stream member
2个回答
1
投票

由于c ++中没有保证的评估顺序,因此如您在修复过程中那样,如果不将评估结果分为多个单独部分,它将无法正常工作。

cppreference引用

在C ++中没有从左到右或从右到左求值的概念。这不要与运算符的从左到右和从右到左的关联性混淆:表达式a()+ b()+ c()被解析为(a()+ b())+ c( ),因为操作符+的从左到右的关联性,但是对c的函数调用可以在运行时首先,最后或在a()或b()之间求值


0
投票

也将值放在<

 friend ostream& operator<<(ostream &out,const Ratio &R){return (out<<R.num<<':'<<R.den<<"\tvalue = "<<R.val);}

现在

#include<iostream>

using namespace std;

typedef double decimal;

class Ratio{
    int num,den;
    decimal val;
public:
    Ratio(){num=1,den=1,val=(decimal)num/den;}
    Ratio update(int a,int b){
        num*=a,den*=b;
        val=(decimal)num/den;
        return *this;
    }
    friend ostream& operator<<(ostream &out,const Ratio &R){return (out<<R.num<<':'<<R.den<<"\tvalue = "<<R.val);}
};

int main()
{
    Ratio R1,R2;

    cout<<"R = "<<R1.update(2,1)<<endl;

}

输出:

  R = 2:1 value = 2

  Process returned 0 (0x0)   execution time : 0.382 s
  Press any key to continue.
© www.soinside.com 2019 - 2024. All rights reserved.