toString()在C ++ 14中的实现

时间:2018-04-21 03:43:10

标签: c++

    class Fruit
{
private:
    std::string m_name;
    std::string m_color;

public:
    Fruit(std::string name, std::string color)
        : m_name(name), m_color(color)
    {
    }

    std::string getName() const { return m_name; }
    std::string getColor() const { return m_color; }

};

class Apple : public Fruit
{
private:
    double m_fiber;

public:
    Apple(std::string name, std::string color, double fiber)
        :Fruit(name, color), m_fiber(fiber)
    {
    }

    double getFiber() const { return m_fiber; }

    friend std::ostream& operator<<(std::ostream &out, const Apple &a)
    {
        out << "Apple (" << a.getName() << ", " << a.getColor() << ", " << a.getFiber() << ")\n";
        return out;
    }
};

我的问题是关于带有重载运算符'&lt;&lt;'的友元函数。 我需要了解一些困扰我的基础知识,为什么函数会返回对流的引用呢?

1 个答案:

答案 0 :(得分:1)

返回到流的左值引用意味着您可以将返回的值重用为引用返回对象的左值,以便您可以将多个插入操作链接在一起。例如,

std::cout << Apple("foo", "red", 3.4) << Apple("bar", "red", 5.5);

or perhaps better seen in terms of precedence as

(std::cout << Apple("foo", "red", 3.4)) << Apple("bar", "red", 5.5);

相反,如果你没有返回一个左值ref,也许只是返回void,只有以下方法可以工作:

std::cout << Apple("foo", "red", 3.4)

如果您刚刚返回std::ostream而不是std::ostream&,那么将尝试尝试复制流对象,并在编译b.c时失败。副本ctor将被删除,如http://www.cplusplus.com/reference/ostream/ostream/ostream/所示。