我一直在学习C++。

From this page,我知道可以用这种方式重载ostream的“<

ostream& operator<<(ostream& out, Objects& obj) {
    //
    return out;
}
//Implementation


friend ostream& operator<<(ostream& out, Object& obj);
//In the corresponding header file

我的问题是...为什么此函数在ostreamObject的末尾需要“&”?

至少我知道“&”用于...
  • 取值的地址
  • 声明对
  • 类型的引用

    但是,我认为它们都不适用于上述重载。我花了大量时间在谷歌搜索和阅读教科书上,但找不到答案。

    任何建议将被认真考虑。

    最佳答案



    因为您通过引用传递了它们。
    您为什么要通过引用传递它们。防止复制。

    ostream& operator<<(ostream& out, Objects const& obj)
                                 //           ^^^^^       note the const
                                 //                       we don't need to modify
                                 //                       the obj while printing.
    

    可以复制obj(潜在地)。但是,如果复制成本很高,该怎么办。因此最好通过引用传递它,以防止不必要的复制。
    out的类型为std::ostream。不能复制(复制构造函数已禁用)。因此,您需要通过引用。

    我通常在类声明中直接声明流运算符:
    class X
    {
        std::string    name;
        int            age;
    
        void swap(X& other) noexcept
        {
            std::swap(name, other.name);
            std::swap(age,  other.age);
        }
        friend std::ostream& operator<<(std::ostream& str, X const& data)
        {
            return str << data.name << "\n" << age << "\n";
        }
        friend std::istream& operator>>(std::istream& str, X& data)
        {
            X alt;
            // Read into a temporary incase the read fails.
            // This makes sure the original is unchanged on a fail
            if (std::getline(str, alt.name) && str >> alt.age)
            {
                // The read worked.
                // Get rid of the trailing new line.
                // Then swap the alt into the real object.
                std::string ignore;
                std::getline(str, ignore);
                data.swap(alt);
            }
            return str;
        }
    };
    

    关于c++ - 为什么重载ostream的operator <<需要引用 “&”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30272143/

    10-10 21:24