流插入 (<<) 运算符过载?

Overloading the stream insertion (<<) operator?

本文关键字:lt 运算符 插入      更新时间:2023-10-16

当我们重载流插入运算符来处理用户定义的对象时,我们通常将其定义为全局友元函数,如下所示:

ostream& operator << (ostream& out, const MyClass& x) {
    // Do something
    return out;
}

我的问题是,我相信对象cout(这是一个全局对象)作为该函数的第一个参数传递。但是为什么?它是一个全局函数,所以无论如何都可以在这个函数中访问它,为什么要把它作为参数传递。换句话说,为什么不执行以下操作:

ostream& operator << (const MyClass& x) {
    // Do something
    return cout;
}

有两个原因。

一个是语义:第一个参数不需要std::cout。它可以是任何std::ostream,无论是std::cerrstd::ofstreamstd::ostringstream等。

第二个是语法:<<必须接受两个参数,并且没有两个参数就无法编写重载(尽管第一个参数可以是this参数)。