什么是朋友ostream

时间:2014-02-24 18:06:08

标签: c++

我对这个代码行在我的头文件中的含义感到有点困惑。

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

有人可以为我澄清吗?

4 个答案:

答案 0 :(得分:5)

该行代码表示运算符&lt;&lt;是一个朋友的东西(因为它列在东西类定义中)。这意味着该运算符&lt;&lt;函数可以访问那里的变量。

&amp;这里的参数意味着您在调用方法时传入对象,这些参数只是这些参数对象的另一个名称。回归ostream&amp;表示您将返回ostream参数,以便您可以连接&lt;&lt;表达式一起避免在使用一个全局cout时创建一个新的“cout”是需要的。

答案 1 :(得分:2)

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

在这种情况下,这意味着operator<<函数的这个特定重载被允许访问something类的内部,以便然后写入输出流,例如{{1} }。

答案 2 :(得分:2)

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

你经常会看到运营商宣称朋友,因为运营商从不在班级内部,但往往需要修改班级中的某些内容和/或访问私人信息。 I.E.您可能不希望外部函数能够使用内部指针等进行清理,但您可能希望能够将它们打印出来以获取状态等。否则您不会经常使用它们 - 从技术上讲,它会破坏封装 - 但运营商是一种特殊情况。

答案 3 :(得分:2)

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

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;
}