为什么重载ostream的运算符<<需要参考"&"?

时间:2015-05-16 05:25:45

标签: c++ operator-overloading

我一直在学习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

我的问题是......为什么这个功能需要&#34;&amp;&#34;在ostreamObject结束时?

至少我知道&#34;&amp;&#34;习惯......

  1. 获取值的地址
  2. 声明对类型的引用
  3. 但是,我认为它们都不适用于上述的重载。我花了很多时间在Google上搜索和阅读教科书,但我无法找到答案。

    任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:11)

  

为什么这个功能需要&#34;&amp;&#34;在ostream和Object的结尾?

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

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

答案 1 :(得分:0)

实施例

void f(int& index)
{
    index = 3;
}

表示f是一个带有int参数的函数,该参数通过引用传递。所以

之后
int a = 4;
f(a);

a的值为3。对于您提到的运算符,这意味着在执行运算符期间可能会更改ostream以及Object(作为某种函数)。