使用cout到对象,为什么我们需要通过引用调用

时间:2017-03-14 16:08:16

标签: c++

在下面的示例中,我想知道为什么我们通过引用ostream来使用调用。当我删除&但并没有得到错误信息。

 class MyArray{
    private:
        int x[10];
    public:
    MyArray(int n)
    {
        for (int i = 0; i < 10; i++)
            x[i] = n;


    }
    friend ostream& operator<<(ostream& pa, MyArray ob);
    };
    ostream& operator<<(ostream& pa, MyArray ob)
    {
        for (int i = 0; i < 10; i++)
            pa << ob.x[i];
        return pa;



    }
    int main()
    {

        MyArray a(5);
        cout << a;
        return 0;
    }

1 个答案:

答案 0 :(得分:0)

std::ostream没有“可访问”的移动或复制构造函数。从C ++ 11开始,复制构造函数为deleted,甚至移动构造函数为protected

按值返回时,(即使发生Copy elision,也需要移动/复制构造函数):

ostream operator<<(ostream& pa, MyArray ob){
    for (int i = 0; i < 10; i++)
        pa << ob.x[i];
    return pa;    //Move or Copy Constructor is required.
}

.............

std::ostream应该是执行高级流输出操作的对象的基类。它意味着是控制stream buffer的对象的基类。

复制std::cout是没有意义的,因为它是一个资源,它被指定来控制一个流缓冲区,负责将字符发送到程序的标准输出。