流插入运算符为什么要被重载为全局函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流插入运算符为什么要被重载为全局函数?相关的知识,希望对你有一定的参考价值。

 
Part 1. 流插入运算符的重载:
 
cout<<5<<endl;
 
cout是在iosream中定义的一个ostream对象
iostream中对“<<”进行了重载。  cout<<5; 即 cout.operator<<(5);
 
iostream中对"<<"的重载函数:
ostream & ostream::operator<<(int n){
     ……//输出n的代码
     return *this; // *this 就是cout
}

 

Part 2. 流插入运算符为什么要被重载为全局函数
 
假设有Complex对象c, 如果要用cout<<c来输出, 就要对“<<“重载。
但是1)不能在ostream类中对"<<"重载,因为ostream类已经被封装好了。
  2)不能在Complex类中对"<<"重载,否则*this对象会混淆。 
class Complex
{
    public:
        int a,b;
};

ostream &operator<<(ostream &os, Complex &x){  //cout<<x<<endl;
    os<<x.a<<"+i"<<x.b;   
    // the "os<<x.a" is os.operator<<(x.a);
    // and in the definition of os.operator<<(), it should returned *this
    // which represents a ostream object 
    return os;
}      

 

 

以上是关于流插入运算符为什么要被重载为全局函数?的主要内容,如果未能解决你的问题,请参考以下文章

输入输出运算符重载

[ C++ ] 类与对象(下)日期类Date补充及流提取和流插入运算符重载

C++学习27 用全局函数重载运算符

重载流插入而不违反信息隐藏?

C++中如何重载输入输出流运算符使其可用于矩阵的输入输出?

运算符重载