为什么operator<<>>运算符重载一定要为友元函数呢?

来源:互联网 发布:域名邮箱和企业邮箱 编辑:程序博客网 时间:2024/06/06 05:10

如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。。。。

而 >>  或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点。。。。。。。。就只能申明为友元函数了。。。

如果一定要声明为成员函数,只能成为如下的形式:

ostream & operator<<(ostream &output)

{

  return output;

}

所以在运用这个<<运算符时就变为这种形式了:data<<cout;

不合符人的习惯。


运算符重载函数可以作为成员函数,友元函数,普通函数。

普通函数:一般不用,通过类的公共接口间接访问私有成员。

成员函数:可通过this指针访问本类的成员,可以少写一个参数,但是表达式左边的第一个参数必须是类对象,通过该类对象来调用成员函数。

友元函数:左边一般不是对象。<< >>运算符一般都要申明为友元重载函数。


一般情况下:

双目运算符重载为友元函数,这样就可以使用交换律,比较方便

单目运算符一般重载为成员函数,因为直接对类对象本身进行操作


总之:如果运算符重载为成员函数,第一个参数必须是本类的对象,因为默认使用第一个参数的对象进行调用该成员函数

附代码:

#include<iostream>

using namespace std;

class Point

{

    float x;

    float y;

public:

    Point(float a,float b):x(a),y(b)

    {

    }

    float getx()

    {

        return x;

    }

    float gety()

    {

        return y;

    }

   Point operator+(Point p1);

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

};



 Point Point::operator+(Point p1)

{

    

    Point p2(x+p1.getx(),y+p1.gety());

    return p2;

}

ostream &operator<<(ostream &out,Point &p)

{

    out <<p.x<<","<<p.y;

    return out;

}

int main()

{

    Point p1(1,1);

    Point p2(2,2);

    Point p3=p1+p2;

    cout << p3<<endl;

    return 0;

}



原创粉丝点击