一.输出运算符重载
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class Complex
{
private:
int _real;
int _image;
public:
Complex(int real=0,int image=0);
~Complex();
//ostream 没有拷贝构造函数
friend std::ostream &operator<<(std::ostream& os ,const Complex& rhs);
};
Complex::Complex(int real,int image)
:_real(real)
,_image(image)
{
}
Complex::~Complex()
{
}
std::ostream &operator<<(std::ostream &os ,const Complex& rhs)
{
if(rhs._real!=0)
{
if(rhs._image>0)
os<<rhs._real<<" + "<<rhs._image<<"i";
else if(rhs._image<0)
os << rhs._real << " - " << (-1) * rhs._image << "i";
else
os<<rhs._real;
}
else
{
if(rhs._image>0)
os<<rhs._image<<"i";
else if(rhs._image<0)
os<<rhs._image<<"i";
else
os<<rhs._real;
}
return os;
}
int main()
{
Complex a(1,3);
cout<<a<<endl;
}
通过输出运算符重载我们可以打印任意我们想打印的内容。但需要注意几点:
- 为什么要定义成友元函数?因为在类中非静态成员函数默认第一个参数的位置有一个地址指针this。这样就会有三个参数导致程序出错,并且由于参数的位置不能够变换所以也不能删除形参Complex。(因为输出只能这样cout<<a,所以参数位置不能变)
- 为什么返回值是ostream的引用,形参也是ostream引用?因为ostream类没有拷贝构造函数。如下图所示因为没有拷贝构造函数所以要加引用,防止调用拷贝构造函数。
二.输入运算符重载
#include <iostream>
#include <math.h>
using std::cout;
using std::cin;
using std::endl;
class Complex
{
private:
int _real;
int _image;
public:
Complex(int real=0,int image=0);
~Complex();
//ostream 没有拷贝构造函数
friend std::ostream &operator<<(std::ostream& os ,const Complex& rhs);
friend std::istream &operator>>(std::istream& is,Complex& rhs);
};
Complex::Complex(int real,int image)
:_real(real)
,_image(image)
{
}
Complex::~Complex()
{
}
std::ostream &operator<<(std::ostream &os ,const Complex& rhs)
{
if(rhs._real!=0)
{
if(rhs._image>0)
os<<rhs._real<<" + "<<rhs._image<<"i";
else if(rhs._image<0)
os << rhs._real << " - " << (-1) * rhs._image << "i";
else
os<<rhs._real;
}
else
{
if(rhs._image>0)
os<<rhs._image<<"i";
else if(rhs._image<0)
os<<rhs._image<<"i";
else
os<<rhs._real;
}
return os;
}
void Readint(int& tem)
{
int num;
while(cin>>num)
{
if(cin.bad())
{
std::cerr<<"input is bad!"<<endl;
return;
}
else if(cin.fail())
{
std::cerr<<"请重新输入整数"<<endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
else
{
tem=num;
break;
}
}
}
std::istream &operator>>(std::istream& is,Complex& rhs)
{
Readint(rhs._real);
Readint(rhs._image);
return is;
}
int main()
{
Complex a(1,3);
Complex b,c;
cout<<a<<endl;
cin>>b;
cout<<b<<endl;
}
输入运算符与输出运算符类似,但是由于要输入到b中所以rhs的类型不能是const,并且还需要对输入的数的类型进行判断,防止输入不匹配的类型数据。