C++中的流插入运算符“>>”和流输出运算符“<<”在C++类库中提供的,所有的C++编译系统都会在提供输入流istream和输出流ostream,cin、cout是分别是istream类和ostream类的对象,在类库的头文件中已经对“<<”、“>>”运算符进行了重载,那么具体是怎么实现的?
输入运算符重载
istream& operator>>(istream& in, A& a)
{
in>>"输入的内容1">>"输入的内容2"...;
return in;
}
C++中输入运算符的重载第一个参数是输入流对象的引用,第二个参数是需要输入的类对象的引用,我们一般将第二个参数定义为非const类型,否则无法赋值,返回值是输入流istream&。
输出运算符重载
ostream& operator<<(ostream& out,const A& a)
{
out<<"输出内容1"<<"输出内容1"...;
return out;
}
C++中输出运算符重载的第一个参数是输出流对象的引用,第二个参数是需要输出的类对象的引用,我们一般将第二个参数定义为const类型,因为输出时不需要改变对象的,返回值是输出流ostream&。
为什么将输入输出运算符定义为friend函数?
共同点就是将输入运算符重载函数和输出运算符重载函数都声明为友元类,为什么这样设计呢?
友元函数
我们知道友元函数是可以被任意的类调用,实现类共享,减少不必要的系统开销,提高效率,使得其他类可以访问该类的私有变量。但也有缺点,就是破坏了类的封装性,一般情况下不建议使用。
友元函数的使用场景
- 在输入输出运算符重载
- 当两个类需要共享数据
原因
在这里定义为友元函数,因为友元函数中不包含this指针,我们要求第一个参数一定是输入输出流的引用,否则代码就会变成 a << cout ,不满足我们的习惯。
我们每个对象都可能会用到输入输出,所以定义为友元函数,使得我们的函数可以备任意类调用。