今有所获有所想,书一文以解来人之惑——C++中的输入输出流的重载

 **C++中的输入输出流的重载**

时间就像轻风一样,刻意感受的时候几乎把你吹倒,不留意的时候又从你身边轻轻飘走了;长此以后,我怕自己会变得麻木,忘记了原来的样子。所以还是决定给自己留点什么,万一哪天忘记了,还可以再翻起来。
大一刚开学的时候觉得C学的还不错,
就参加了学校的ACM战队。从中了解到了oj,我刷了一百多道题之后,就有了一个较大胆的想法,出ACM的坑,究竟是以突破语言单一好,还是以单一语言填满算法的坑更好。我不知道,我选择了前者,我先后学了C、Python、C++、Java、C#之后,感觉语言差别并不是很大。
我也终于知道前人说的还是很有道理的,算法很重要,但我也不觉得我的选择有什么不妥的,所谓“纸上得来终觉浅,绝知此事要躬行”,对后来者没有什么好的建议,唯一的建议就是"不忘初心";
宣言:
这个月开始ACM刷题之旅!!!

C++中的输入输出流的重载
C++的流插入运算符"<<“和流提取运算符”>>“是C++在类库中提供的,所有C++的编译系统都在类库中提供了输入流类(istream)和输出流(ostream)的的对象cin和cout,且在类库提供的头文件中已经对”<<“和”>>“进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据。因此,凡是用"cout"和"cin"对标准类型数据进行输入输出,都要用#include把本文件包含到本程序文件中。
用户自己定义的类型的数据,是不能用”<<“和”>>“来输入输出的。如果想用来它们输出和输入自己声明的类型的数据,必须对他们重载。
对”<<“和”>>“重载函数形式如下:
istream & operator >> (istream &,自定义类 &);
ostream & operator << (ostream &,自定义类 &);
即重载运算符”>>“的函数的第一个参数和函数的类型都必须是 istream & 类型,第二个参数是要进行输入操作的类。重载”<<“的函数的第一个参数和函数的类型都必须是ostream &类型,第二个参数是要进行输出操作的类,因此,只能将重载”>>“和”<<“的函数作为友元函数或普通函数,而不能将它们定义为成员函数。
我就以重载流插入运算符”<<"为例,流提取运算符和插入没都大的区别,要学会举一反三;

#include "iostream"
using namespace std;
class Matrix{
	int row,column;
	int **M;
public:
	Matrix(int r=0,int c=0,int **m=NULL){
		row=r;
		column=c;
		M=m;
	}
	Matrix operator +(Matrix);
	int get(int i,int j){
		return M[i][j];
	}
	bool ifnull(){//判断矩阵是否为空 
		if(M != NULL)	
			return true;
		else
			return false;
	}
	friend ostream &operator <<(ostream &out,const Matrix &a);
};
Matrix Matrix::operator +(Matrix a){
	Matrix temp;
	temp.row = a.row;
	temp.column = a.column;
	temp.M = new int*[row];
	for(int i = 0;i < row; i++){
		temp.M[i] = new int[column];
		for(int j = 0;j < column; j++){
			temp.M[i][j] = M[i][j] + a.M[i][j];
		}
	}
	return temp;
}
ostream &operator << (ostream &out,const Matrix &a){
	for(int i = 0; i < a.row; i++){
		int j = 0;
		for(j = 0; j< a.column - 1 ; j++ ){
			out << a.M[i][j] << " ";
		}
		out << a.M[i][j] <<endl;
	}
	return out;
}
int main(){
	int row , column;
	int **m1,**m2;
	cin >> row >> column;
	m1 = new int*[row];
	for(int i = 0; i < row; i++){
		m1[i] = new int[column];
		for(int j = 0;j < column; j++){
			cin>>m1[i][j];
		}
	}
	m2 = new int*[row];
	for(int i=0; i < row; i++){
		m2[i] = new int[column];
		for(int j = 0; j < column;j++){
			cin>>m2[i][j];
		}
	}
	Matrix matrix1(row,column,m1),matrix2(row,column,m2),matrix3;
	matrix3 = matrix1 + matrix2;
	cout << matrix3 << endl << 5 << endl;
	return 0;
} 

用"<<"输出矩阵数据
以下为重载流插入运算符的代码
ostream &operator << (ostream &out,const Matrix &a){
for(int i = 0; i < a.row; i++){
int j = 0;
for(j = 0; j< a.column - 1 ; j++ ){
out << a.M[i][j] << " ";
}
out << a.M[i][j] <<endl;
}
return out;
}
这里一定要联想到当初学函数的时候中的形参和实参,之所以要返回那个out是因为out与cout共用一段储存单元,或者可以说别名,因此可以理解为将输出流cout的现状返回,既保留输出流的现状。

可以看到,在C++中,运算符重载中使用引用(reference)的重要性。利用引用作为函数的形参,可以在调用函数的过程中不是利用传递值的方式而是通过传址方式使形参成为实参的别名,因此不产生临时变量(实参的副本),减少了时间和空间的开销。此外,如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值(left value),可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使用“<<”输出)。但使用引用时要特别小心,因为修改了引用就等于修改了它所代表的对象。
发布了19 篇原创文章 · 获赞 6 · 访问量 474

猜你喜欢

转载自blog.csdn.net/weixin_44350891/article/details/89931409