开发者社区> 问答> 正文

c++重载流插入运算符问题? 400 报错

c++重载流插入运算符问题? 400 报错

ide为windows下的g++,我重载了流插入运算符<<,在传递参数时出现错误,代码如下:

#include <iostream>

using namespace std;

class number{
 private:
 double a,b,c,d;
 public:
 number(double x1,double x2,double x3,double x4):a(x1),b(x2),c(x3),d(x4){}
 number(){}
 number operator +(number &plu);
 friend number operator *(number &mul,number &mul1);
 number operator --(int);
 friend ostream& operator <<(ostream &,number &);
};

number number::operator +(number &plu)
{
 number num;
 num.a=a+plu.a;
 num.b=b+plu.b;
 num.c=c+plu.c;
 num.d=d+plu.d;
 return num;
}

number operator *(number &mul,number &mul1)
{
 number result;//需要构造函数的重载
 result.a=mul.a*mul1.a;
 result.b=mul.b*mul1.b;
 result.c=mul.c*mul1.c;
 result.d=mul.d*mul1.d;
 return result;
}

number number::operator --(int)
{
 this->a=a--;
 this->b=b--;
 this->c=c--;
 this->d=d--;
 return *this;
}

ostream& operator <<(ostream &output,number &num)
{
 output<<num.a<<endl<<num.b<<endl<<num.c<<endl<<num.d<<endl;
 return output;
}

int main()
{
 number number1(158.1,124.39,332.2,967.03);
 number number2(2.3,32.3,48.4,64.3);
 number number3,number4;
 number3=number1+number2;
 cout<<(number1+number2)<<endl<<(number1*number2)<<endl;

 cout<<number1--<<endl;

 return 0;
}

问题:在int main()中,cout<<(number1+number2)<<endl<<(number1*number2)<<endl;

 cout<<number1--<<endl;这两句代码有问题,报错是传递参数出错

展开
收起
爱吃鱼的程序员 2020-06-03 15:11:10 498 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    问编译问题最好带上编译报错,我猜,friend ostream& operator <<(ostream &,number &);  后面这个改成const number& 试试,因为你num--是返回一个临时变量作为<<的输入,可能g++中不允许对返回的临时变量操作,另外你的--的重载中类似    this->a = a--; 这样的代码 真的有意义么
    ######

    friend ostream& operator <<(ostream &,number &);
    修改成

    friend ostream& operator <<(ostream &,const number &);
    这个主要涉及到引用,左值,右值的问题。



    ######

    问题一堆,  operator-- 这个重载有问题 this->a -- 即可, 你this->a = a-- 这样写, =两边都在修改a, 是undefined的. 编译器应该会告警.

    operator<< 这个重载 用const修饰第二个参数 , 没修改值 尽量用const.

    operator+ 和operator* 的参数 都用const 修饰 "只读"访问 尽量用const


    这样改完就可以编译运行了 亲测可用


    2020-06-03 16:41:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载