什么是朋友流

What is friend ostream

本文关键字:朋友 什么      更新时间:2023-10-16

我对这行代码在我的头文件中到底是什么意思有点困惑。

friend ostream & operator << (ostream &, const something &);

有人可以为我澄清吗?

这行代码表示运算符<<是某物的朋友(因为它列在某物类定义中)。 这意味着运算符<<函数可以访问其中的变量。

&here作为参数意味着你在调用方法时传入对象,这些参数只是这些参数对象的另一个名称。 返回 ostream &意味着您将返回 ostream 参数,以便您可以将<<表达式连接在一起,避免在使用一个全局 cout 时创建新的"cout"。

正如在许多地方提到的,friend是绕过C++的正常保护机制 - 它允许有问题的函数访问受保护/私有成员,这通常只有类成员才能做到。

您经常会看到操作员声明为好友,因为运算符从不在类本身内部,但通常需要修改类中的某些内容和/或访问私人信息。 也就是说,您可能不希望外部函数能够处理您的内部指针等,但您可能希望能够将它们打印出来以获取状态等。否则你不会看到它们经常使用——从技术上讲,它破坏了封装——但运算符是一种特例。

C++ class可以将另一个类或函数声明为friend。友好类和方法可以访问类的私有成员。 因此,未在任何类中定义的自由运算符方法 << 可以将something插入到流中,并查看并使用 something 的私有成员来完成其工作。 假设something complex

class complex {
    private:
       double re;
       double im;
    public:
       complex(double real = 0.0, double imag = 0.0) : re(real), im(imag) {}
       friend ostream & operator<<(ostream& os, complex& c);
};
ostream & operator<<(ostream& os, complex& c){
    os << c.re << std::showpos << c.im;
    return os;
}

friend 关键字可以命名函数或整个类。在任一情况下,都意味着允许命名函数或命名类的实现访问出现friend声明的类的privateprotected成员。

在这种情况下,这意味着允许operator<<函数的这种特定重载访问something类的内部,以便写入输出流,例如 std::cout .