在c ++中重载<<运算符

嘿,我得到了一些我无法理解的东西,有两种类型的解决方案用于重载这个算子1包括朋友在方法开始的时候,另外一个没有朋友。 如果有人解释他们之间的优点/缺点有什么区别,我会非常喜欢。 例如重载运算符<< in class rational:

class Rational:
{
    private: int m_t,m_b;
    ...
    friend ostream& operator<<(ostream& out,const Rational& r) // option 1
    { return out << r.m_t << "/" <<r.m_b;}  // continue of option 1

    ostream& operator<<(ostream& out,const Rational& r){return r.print();} // option 2
    virtual ostream& print(ostream& out) const // continue of option 2
    { //
      return out<<m_t << "/" << m_b;
    } //
};

我被告知,第二个选项是不正确的,如果some1可以纠正我,我会非常appriciate它。 提前致谢。


operator<< (for ostream )需要是一个自由函数(因为左边的参数是流,而不是你的类)。

friend关键字使它成为一个免费函数(一个可以访问私有成员的免费函数)。

但是,如果可以通过公共接口实现此功能,则最好这样做,只需使用非朋友免费功能。

class Rational:
{
    private: int m_t,m_b;
    public:
    ...
    virtual ostream& print(ostream& out) const
    { 
      return out<<m_t << "/" << m_b;
    } 
};

ostream& operator<<(ostream& out,const Rational& r)
{
    return r.print(out);
}

简短的回答:选项#2实际上不是一个选项,而是一个语法错误,因为它试图将一个二元运算符定义为传递两个操作数的成员。

稍微长一些的答案:如果你使第二个操作数成为一个自由函数(不是类的成员),这将起作用。 哪一个更好取决于具体情况和您的偏好。 对于初学者来说:第一个缺点是它允许operator<<访问Rational所有内容(包括私有助手函数),而第二个的缺点是您可以为类的公共API引入一个没有人需要的函数。


考虑一个应该输出Rational的num和den的函数:

ostream& operator<<(ostream& out, const Rational& r)
{
    return out;
}

不幸的是,这只是一个全球性的功能。 像其他全局函数一样,它不能访问Rational的私有成员。 为了使它与Rational对象一起工作,您需要使它成为Rational friend

class Rational
{
    private: int m_t,m_b;

    // ...

    friend ostream& operator<<(ostream& out, const Rational& r);
};

ostream& operator<<(ostream& out, const Rational& r)
{
    out << r.m_t << "/" <<r.m_b;
    return out;
}

friend ostream& operator<<(ostream& out, const Rational& r); 里面的Rational类表明, ostream& operator<<(ostream& out, const Rational& r)函数可以直接使用Rational的私有成员。

现在当你写:

Rational r(1, 2);  // Say, it sets num and den
cout << r;

进行以下函数调用:

operator<<(cout, r);

你可以写operator<<作为Rational一个成员函数吗? 这是不可能的,因为上面的转换在cout必须是第一个参数。 如果您让operator<<作为Rational的成员:

class Rational
{
    private: int m_t,m_b;

    // ...

    public:

    ostream& operator<<(ostream& out) const
    {
        out << r.m_t << "/" <<r.m_b;
        return out;
    }
};

你需要这样称呼它:

Rational r(1, 2);
r.operator<<(cout);

这是丑陋的。

链接地址: http://www.djcxy.com/p/73137.html

上一篇: overloading the << operator in c++

下一篇: not able to create const object of class derived from std::vector