重载<<运算符
Overloading the << operator
我刚刚写了一个复数类,你可以看到它的代码如下;假设a和B是复数,我的问题是,当我写代码:
cout & lt; & lt;A + B;//它给我一个错误
但是当我将A+B赋值给Complex类的实例时,比如C,它可以正常工作。我的意思是:
Complex C=A+B <<endl;cout & lt; & lt;C;//运行正常
我真的很困惑为什么我不能使用A+B作为<<的右操作数操作符。我怎么能直接算出A+B呢?提前感谢你的帮助。以下是我目前想到的:
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double image;
public:
Complex(double r, double i){ real=r ; image=i;}
int GetReal(){ return real;}
int GetImage(){return image;}
//overload complex + complex
friend Complex operator+(const Complex &c1,const Complex &c2) ;
//overload complex + double
friend Complex operator+(const Complex &c,double Number) ;
//overload double + complex
friend Complex operator+(double Number,const Complex &c) ;
//overload complex * complex
friend Complex operator*(const Complex &c1, const Complex &c2);
//overload complex * double
friend Complex operator*(const Complex &c, double Number);
//overload double * complex
friend Complex operator*(double Number, const Complex &c);
//overloading output operator
friend ostream& operator<< (ostream &out, Complex &c);
};
Complex operator+(const Complex &c1,const Complex &c2){
return Complex(c1.real + c2.real,c1.image + c2.image);}
Complex operator+(const Complex &c,double Number){
return Complex(c.real + Number , c.image);}
Complex operator+(double Number,const Complex &c){
return Complex(Number + c.real,c.image);}
//(a + bi) * (c + di) = ((ac-bd) + (ad+bc)i)
Complex operator*(const Complex &c1, const Complex &c2){
return Complex(c1.real*c2.real-c1.image*c2.image,c1.real*c2.image+c1.image*c2.real);}
Complex operator*(const Complex &c, double Number){
return Complex(c.real*Number,c.image*Number);}
Complex operator*(double Number, const Complex &c){
return Complex(Number*c.real,Number*c.image);}
ostream& operator<< (ostream &out, Complex &c){
if( c.image>0){
out << c.real << "+ " <<
c.image << "i";}
else if (c.image==0){
out<<c.real;
}
else { out<< c.real<<"- "<<
c.image<< "i";}
return out;}
int main(){
Complex A(1,2);
Complex B(3,4);
cout<<"A is: "<<A<<endl;
cout<<"B is: "<<B<<endl;
Complex c=A+B;
cout<<c<<endl; //works correctly
cout<<A+B<<endl; // gives an Error ?!
}
A+B
是右值,因为您的operator+
(正确地)按值返回。不能将非const左值引用绑定到右值。您需要将操作符更改为const
参考:
friend ostream& operator<< (ostream& out, const Complex& c);
^^^^^
需要形参是const引用,而不是可变引用。也就是说,将operator<<
的定义和声明中的Complex& c
更改为const Complex& c
,它应该可以工作。这样做的原因是临时结果(如a + b
)不能修改,而命名的非const变量可以修改。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多