C++ <<运算符重载,无友元功能

C++ << operator overloading without friend function

本文关键字:lt 友元 功能 运算符 C++ 重载      更新时间:2023-10-16

正如主题所说。有可能这样做吗?我能够在重载"+"运算符中实现这一点,但是,我不能用"<lt;'操作人员

这是一个适用于我的朋友功能的代码示例:

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;
}

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

您的Vector示例仅访问public成员,因此它有效。

您的Punkt2D正在访问private成员,因此操作员需要是您的朋友。

它需要是一个朋友才能访问私人成员。

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

流运算符:

operator << output
operator >> input

当您使用这些作为流运算符(而不是二进制移位)时,第一个参数是流。由于您没有访问流对象的权限(不能由您修改),这些不能是成员运算符,它们必须在类的外部。因此,他们必须是类的朋友,或者可以访问为您进行流式处理的公共方法。