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

标签 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 是一个局部变量(如果不是,请纠正我)。

我不知道这段代码是否真的有效,但在网络上的大多数引用资料中,我发现了类似的实现。

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

提前致谢。

最佳答案

I think os is a local variable (correct me if it is not, somehow).

事实并非如此。 os 是本地引用,没错。但它绑定(bind)到非本地对象。

因为它是一个非常量左值引用,所以它必须绑定(bind)到一个对象,该对象的生命周期超过了函数调用。因此将该引用绑定(bind)到从函数返回的引用是完全可以的。没有什么会最终悬空。

事实上,这就是启用函数链式调用所必须执行的操作:

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

只是一堆函数调用:

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

关于c++ - 从友元函数返回局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47618053/

相关文章:

c++ - c++ 数组和内存错误

c++ - 如何声明运算符/重载函数以对 const 变量和非常量变量进行操作?

c++ - 重载提取运算符

c++ - 该对象具有与成员函数 C++ 不兼容的类型限定符

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

c# - 使用 RhinoMocks 模拟引用参数

c++ - 在八叉树数组上调用删除

c++ - 单成员结构的灵气属性传播问题

c - 为什么仅使用此 C 程序的参数列表中声明的指针即可通过引用传递?

c++ - 是否可以将代码包装在匿名 namespace 中以使用指令?