当类中用很多成员变量,如果输出成员函数,在不重载输入输出运算符的情况下,就显得很麻烦看下面这个例子:
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: 很自然地,输入运算符的重载:
istream& operator>> (istream &in, Point &cPoint)
{
in >> cPoint.m_dX;
in >> cPoint.m_dY;
in >> cPoint.m_dZ;
return in;
}
本文介绍了如何通过友元函数重载C++的输出运算符来简化类中多个成员变量的输出操作,同时讨论了重载函数返回值的重要性以及输入运算符重载的方法。
921

被折叠的 条评论
为什么被折叠?



