重载流插入运算符和流提取运算符
流插入运算符:“<<”
流提取运算符:“>>”
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