从友元函数返回局部变量的引用

时间:2017-12-03 11:49:18

标签: c++ operator-overloading pass-by-reference friend local-variables

我遇到了一个重载<<<<<<<<和>> C ++中的运算符。然而,有一个疑问,因为实现它的所有示例似乎都返回对局部变量的引用

class Date  
{  
    int mo, da, yr;  
public:  
    Date(int m, int d, int y)  
    {  
        mo = m; da = d; yr = y;  
    }  
    friend ostream& operator<<(ostream& os, const Date& dt);  
};  

ostream& operator<<(ostream& os, const Date& dt)  
{  
    os << dt.mo << '/' << dt.da << '/' << dt.yr;  
    return os;  
}  

int main()  
{  
    Date dt(5, 6, 92);  
    cout << dt;  
}

我认为os是一个局部变量(如果不是,请纠正我)。

我不知道这段代码是否真的有效,但在网上的大多数参考资料中,我都找到了类似的实现。

注意:有意省略包含头文件和使用命名空间std语句。

提前致谢。

1 个答案:

答案 0 :(得分:3)

  

我认为os是一个局部变量(如果不是,请纠正我)。

这不是真的。 os是本地参考,这是真的。但它与非本地对象绑定。

由于它是一个非const左值引用,它必须绑定到一个寿命超过函数调用的对象。因此绑定对函数返回的引用是完全可以的。什么都不会结束。

事实上,这是启用链式调用函数所必须做的事情:

std::cout << foo << bar << baz;

只是一堆函数调用:

operator<<(operator<<(operator<<(std::cout, foo), bar), baz);