《新标准C++程序设计》4.6(C++学习笔记16)

重载流插入运算符和流提取运算符

 

流插入运算符:“<<”

流提取运算符:“>>”

cout 是在 iostream 中定义的,ostream 类的对象。

“<<” 能用在cout 上是因为,在iostream里对 “<<” 进行了重载。

怎么重载才能使得cout << 5; 和 cout << “this”都能成立?

ostream & ostream::operator<<(int n)
{
…… //输出n的代码
return * this;
}
ostream & ostream::operator<<(const char * s )
{
…… //输出s的代码
return * this;
}

cout << 5 << “this”;

本质上的函数调用的形式是什么?

cout.operator<<(5).operator<<(“this”);

 

Question:

假定c是Complex复数类的对象,现在希望写“cout << c;”,就能以“a+bi”的形式输出c的值,写“cin>>c;”,就能从键盘接受“a+bi”形式的输入,并且使得c.real = a,c.imag = b。

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Complex {
  double real,imag;
public:
Complex( double r=0, double i=0):real(r),imag(i){ };
friend ostream & operator<<( ostream & osconst Complex & c);
friend istream & operator>>( istream & is,Complex & c);
};
ostream & operator<<( ostream & os,const Complex & c)
{
  os << c.real << "+" << c.imag << "i"; //以"a+bi"的形式输出
  return os;
} 
istream & operator>>( istream & is,Complex & c)
{
  string s;
  is >> s; //将"a+bi"作为字符串读入, “a+bi” 中间不能有空格
  int pos = s.find("+",0);
  string sTmp = s.substr(0,pos); //分离出代表实部的字符串
  c.real = atof(sTmp.c_str()); //atof库函数能将const char*指针指向的内容转换成 float
  sTmp = s.substr(pos+1, s.length()-pos-2); //分离出代表虚部的字符串
  c.imag = atof(sTmp.c_str());
  return is;
}
int main()
{
  Complex c;
  int n;
  cin >> c >> n;
  cout << c << "," << n;
  return 0;
}

运行结果可以如下:

13.2+133i 87↙

13.2+133i, 87

posted @ 2020-02-15 21:17  沐沐Y  阅读(139)  评论(0编辑  收藏  举报