cout是ostream类的对象,cin是istream类的对象。
我们平时用的cout<<就相当于cout.operator<<(...)。也就是说正常使用(不对operator<<进行函数重载,我们用的都是ostream类库中本身定义好了cout对象的成员函数)
而当我们需要对cout<<进行重载时,比如我们定义了一个类Student,他的一个对象s1,我们想要cout<<s1,这时<<的意义就改变了,因此如果我们想按照我们自己的个性化需求来使用<<运算符,就需要对其进行重载,而重载分为重载为全局函数和引入为类的友元函数,由于我们是要通过cout这个iostream头文件中定义的对象来调用operator<<这个函数,当我们cout<<一个自定义的对象时,编译器在cout本身定义<<的那些基础数据类型中找不到参数满足我们需要的函数,这时有个全局函数的签名满足我们的需要,因此这个函数就是我们最终调用的函数,也就是我们重载<<运算符的函数。
ex:类的友元函数
ostream& operator<<(ostream& co,const Student& s) { co<<s.sname<<endl; return co; }
关于这个函数,有两点值得注意:
(1)它的返回值,是这样理解的:
cout<<5<<"hello";
在我们输出了一个5以后返回的是调用第一个<<的对象的引用,即相当于第一个cout,我们就可以接着连续的用同一个cout来调用第二个<<函数了。
(2)之所以把全局函数以友元的形式引入class Complex中是因为在这个重载函数的实现过程中,我们往往需要引用实参对象中的一些非公有的对象,而这时就必要获得权限,C++中的做法便是将其以友元的形式引入class Complex中。