我对这个代码行在我的头文件中的含义感到有点困惑。
friend ostream & operator << (ostream &, const something &);
有人可以为我澄清吗?
答案 0 :(得分:5)
该行代码表示运算符&lt;&lt;是一个朋友的东西(因为它列在东西类定义中)。这意味着该运算符&lt;&lt;函数可以访问那里的变量。
&amp;这里的参数意味着您在调用方法时传入对象,这些参数只是这些参数对象的另一个名称。回归ostream&amp;表示您将返回ostream参数,以便您可以连接&lt;&lt;表达式一起避免在使用一个全局cout时创建一个新的“cout”是需要的。
答案 1 :(得分:2)
friend
关键字可以命名函数或整个类。在任何一种情况下,都意味着允许命名函数或命名类的实现访问出现private
声明的类的protected
和friend
成员。 / p>
在这种情况下,这意味着operator<<
函数的这个特定重载被允许访问something
类的内部,以便然后写入输出流,例如{{1} }。
答案 2 :(得分:2)
正如许多地方所提到的,friend
是C ++正常保护机制的旁路 - 它允许有问题的函数访问受保护/私有成员,通常只有类成员才能这样做。
你经常会看到运营商宣称朋友,因为运营商从不在班级内部,但往往需要修改班级中的某些内容和/或访问私人信息。 I.E.您可能不希望外部函数能够使用内部指针等进行清理,但您可能希望能够将它们打印出来以获取状态等。否则您不会经常使用它们 - 从技术上讲,它会破坏封装 - 但运营商是一种特殊情况。
答案 3 :(得分:2)
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;
}