C++输入 / 输出运算符的重载-详细解释

为什么需要重载输入输出运算符

有人会问,我直接用 iostream 里面的标准输入输出不好吗,搞这么麻烦?
事实上,你会发现C++里面很多的(尤其是运算符)重载都是 面向对象惹的祸。而用户自定义数据类型的输入输出,就是通过重载运算符“<<“和”>>“实现的。

重载输出运算符

重载输出运算符”<<“也称为插入运算符,用于用户自定义类型的输出,其定义函数的一般形式为:

ostream &operator<<( ostream &stream, 类名 对象名 )
{
     
	// 操作代码
	return stream;
}

其中,第一个参数stream是对ostream对象的引用,必须是输出流,它可以是其他合法的标识符,但必须与return后面的标识符相同;第二个参数接收将被输出的对象。

重载输入运算符

重载输入运算符“>>“也称为提取运算符,用户用于自定义类型的输入,其定义函数的一般格式为:

istream &operator<<( istream &stream, 类名 &对象名 )
{
     
	// 操作代码
	return stream;
}

其中,第一个参数stream是对istream对象的引用,必须是输出流,它可以是其他合法的标识符,但必须与return后面的标识符相同;第二个参数是一个引用,前面的“&”不能省略。

特别注意

  • 重载输入运算符函数不能是类的成员函数,必须是类的非成员函数
  • 作为非成员函数,重载输入运算符不能访问类的私有成员

故:输入输出运算符的重载必须用友元函数

一个代码实现

// 输入输出运算符的重载
// 重载输入输出运算符必须用友元函数
#include 
// 为调用system("pause")
// #include 
// Linux 或者 Mac 下应使用 pause();
// #include 
// 但这里使用getchar(),因为那个我不会...
#include 

using namespace std;

class Overload_IO
{
     
public:
	int a;
	int b;
	Overload_IO():a(0),b(0){
     }
	Overload_IO(int a, int b):a(a),b(b){
     }
	friend ostream &operator<<(ostream &os, const Overload_IO &T);
	friend istream &operator>>(istream &is, Overload_IO &T);
};

ostream &operator<<(ostream &os, const Overload_IO &T)
{
     
	os << "a = " << T.a << endl;
	os << "b = " << T.b << endl;

	return os;
}

istream &operator>>(istream &is, Overload_IO &T)
{
     
	is >> T.a >> T.b;
	return is;
}

int main(int argc, char *argv[])
{
     
	Overload_IO t(1, 2);
	cout << t << endl;

	cout << "请输入a b:" << endl;
	cin >> t;
	cout << t << endl;

	// system("pause");
	getchar();			// 用于消除输入数据时的回车
	getchar();
	return 0;
}


运行结果(vscode, Mac)

a = 1
b = 2

请输入a b:
3 4
a = 3
b = 4

// 注意这里我又敲了一个回车

你可能感兴趣的:(C++,c++,类)