输入输出运算符重载( Overloading the I/O operators)

当类中用很多成员变量,如果输出成员函数,在不重载输入输出运算符的情况下,就显得很麻烦看下面这个例子:

class Point
{
private:
    double m_dX, m_dY, m_dZ;
 
public:
    Point(double dX=0.0, double dY=0.0, double dZ=0.0)
    {
    m_dX = dX;
    m_dY = dY;
    m_dZ = dZ;
    }
 
    double GetX() { return m_dX; }
    double GetY() { return m_dY; }
    double GetZ() { return m_dZ; }
};

如果想输出这个类的成员变量就必须这样:

Point cPoint(5.0, 6.0, 7.0);
cout << "(" << cPoint.GetX() << ", " <<
    cPoint.GetY() << ", " <<
    cPoint.GetZ() << ")";

现在我们重载输出运算符"<<"。输出运算符也是二元运算符,就像“+”那样。好了,在类中添加一个友元函数(就是运算符重载函数)。

friend ostream& operator<< (ostream &out, Point &cPoint);

class Point
{
private:
    double m_dX, m_dY, m_dZ;
 
public:
    Point(double dX=0.0, double dY=0.0, double dZ=0.0)
    {
    m_dX = dX;
    m_dY = dY;
    m_dZ = dZ;
    }
 
    friend ostream& operator<< (ostream &out, Point &cPoint);
 
    double GetX() { return m_dX; }
    double GetY() { return m_dY; }
    double GetZ() { return m_dZ; }
};
 
ostream& operator<< (ostream &out, Point &cPoint)
{
    // Since operator<< is a friend of the Point class, we can access
    // Point's members directly.
    out << "(" << cPoint.m_dX << ", " <<
        cPoint.m_dY << ", " <<
        cPoint.m_dZ << ")";
    return out;
}

然后,就可以这样输出了:

Point cPoint(5.0, 6.0, 7.0);
cout << cPoint;

这样重载很自然。不过,需要指出这儿为啥要返回ostream类型的对象。原因是要照顾这样的使用:cout<< cPoint<<endl。如果重载函数返回void,那么cout<<cPoint也可以,但是cout<< cPoint<<endl就不行,因为编译器会遇到void<<endl这样的错误。

下面验证一下结果:

int main()
{
    Point cPoint1(2.0, 3.0, 4.0);
    Point cPoint2(6.0, 7.0, 8.0);
 
    using namespace std;
    cout << cPoint1 << " " << cPoint2 << endl;
 
    return 0;
}

output:

(2.0, 3.0, 4.0) (6.0, 7.0, 8.0)

很自然地,输入运算符的重载:

istream& operator>> (istream &in, Point &cPoint)
{
    in >> cPoint.m_dX;
    in >> cPoint.m_dY;
    in >> cPoint.m_dZ;
    return in;
}



你可能感兴趣的:(输入输出运算符重载( Overloading the I/O operators))