C ++<<没有友元函数的运算符重载

时间:2016-05-13 09:19:39

标签: c++ overloading operator-keyword

正如主题所说的那样。有可能这样做吗?我能够在重载'+'运算符时实现这一点,但是,我不能用'<<'来做到这一点运营商。

这是一个对我有友情功能的代码示例:

class Punkt2D
{
    int x,y;

    public:
        Punkt2D(int wartoscX, int wartoscY) : x(wartoscX), y(wartoscY) {}
        friend ostream& operator<<(ostream& out, Punkt2D& punkt);
};

ostream& operator<<(ostream& out, Punkt2D& punkt)
{
    out << "(" << punkt.x << ", " << punkt.y << ")" << endl; 
    return out;
}

int main()
{
    Punkt2D p1(10,15);

    cout << p1 << endl;
    return 0;
}

我在'+'上尝试了这段代码而没有与该函数交朋友。其他运营商也可以吗?也许这是一个愚蠢的问题,但是我对C ++很新,并且找不到关于这个主题的任何资源:(

class Vector
{
    public:

    double dx, dy;
    Vector() {dx=0; dy=0;}
    Vector(double x, double y) 
    {
        cout << "Podaj x " << endl;
        cin >>x;
        cout << "Podaj y " << endl;
        cin >> y;
        dx = x; dy = y;

    }
    Vector operator+ (Vector v);
};


Vector Vector::operator+ (Vector v)
{
    Vector tmpVector;
    tmpVector.dx = dx +v.dx;
    tmpVector.dy = dy+ v.dy;
    return tmpVector;
}

int main()
{
    double d,e;

    Vector a(d,e);
    Vector b(d,e);
    Vector c;
    c = a +b;
    cout<<endl << c.dy << " " << c.dx;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

访问私人会员需要成为朋友。

Vector中,成员是公开的,所以不同。

答案 1 :(得分:1)

只要函数只调用类的public成员函数(或访问public数据成员,如果有的话),它就不需要是朋友。

您的Vector示例仅访问public个成员,因此可以正常运行。

您的Punkt2D正在访问private个成员,因此运营商需要成为朋友。

答案 2 :(得分:0)

流媒体运营商:

operator << output
operator >> input

当您将这些用作流运算符(而不是二进制移位)时,第一个参数是流。由于您无权访问流对象(不是您自己修改的),因此这些不能是成员运算符,因此它们必须位于类的外部。因此,他们必须是班级的朋友,或者可以访问一个公共方法,为你做流式传输。