"其中"是这个超载的运营商接受" out"?

时间:2014-07-16 18:37:11

标签: c++ enums operator-overloading overloading ostream

下面的代码显示了如何为枚举类型重载<<运算符。 (摘自here)。

days operator+ (days d)
{
    return static_cast<days>((static_cast<int>(d) + 1) % 7);
}

ostream& operator<< (ostream& out, days d)
{
    switch(d)
    {
        case SUNDAY: out << "SUNDAY"; 
        break;
        case MONDAY: out << "MONDAY";
        break;
        case TUESDAY: out << "TUESDAY";
        break;
        case WEDNESDAY: out << "WEDNESDAY";
        break;
        case THURSDAY: out << "THURSDAY";
        break;
        case FRIDAY: out << "FRIDAY";
        break;
        case SATURDAY: out << "SATURDAY";
        break;
    }
    return out;
}

上述代码表面上可以按以下方式使用:

int main()
{
    days aDay = SUNDAY;
    cout << +aDay << endl;

    return 0;
}

很明显,这里的意图是重载<<运算符,以便在枚举类型days上使用。最后,我们将其用作:cout << aDay << endl;

我不明白,我们输入out流的方式/位置。我可以理解,day对象正在输入<<,因为它位于右侧,但我看不到out对象的输入位置...只有右边有一件事......

谢谢。

2 个答案:

答案 0 :(得分:1)

ostream& operator<< (ostream& out, days d)函数不应由您在代码中直接调用。相反,通过定义该函数,您告诉编译器“这是一个实现<<运算符的函数,用于将days对象传递给ostream对象。”然后,只要执行operator<<之类的操作,编译器就会隐式生成对cout << aDay << endl;函数的调用。 cout对象 ostream(或其子类)的实例。

答案 1 :(得分:1)

别忘了你总是可以使用括号 - &gt; cout << +aDay << endl - &gt; (cout << +aDay) << endl

编译器完成了剩下的工作,即查找匹配std::ostream, days参数的运算符重载,如Mike Hots所说。