我正在使用以下语法在结构内重载插入运算符(<<):
struct Address{
string street;
string cross;
int suite;
friend ostream &operator <<(ostream &oss, const Address &other){
oss<<"street: "<<other.street<<"cross: "<<other.cross<<"suite: "<<other.suite;
return oss;
}
};
我看到只有将函数声明为struct'Address'的朋友,我的代码才会编译。根据我的理解,当需要访问类的私有成员时,朋友功能非常有用。但是,由于在结构中所有成员都是公开的,因此不必将'<<'运算符声明为朋友。
任何人都可以澄清是否需要在这里将“ <<”运算符声明为结构“地址”的朋友吗?
答案 0 :(得分:7)
实际上,可以在没有friend
的命名空间范围内定义该运算符。
在这种情况下,由于您给出的确切原因,您不需要“使其”成为friend
,所以不清楚您在哪里听说过!
struct Address
{
string street;
string cross;
int suite;
};
inline ostream& operator<<(ostream& oss, const Address& other)
{
oss << "street: " << other.street << "cross: " << other.cross << "suite: " << other.suite;
return oss;
}
(我假设您将整个定义保留在标头中,所以我将其设为inline
,尽管实际上我可能会在标头中声明它,然后在其他地方定义它。)
但是用struct
定义的类仍然只是一个类,并且仍然可以包含private
个成员。如果您有这样做的话,您将再次需要friend
。
有些人可能会选择总是进行friend
函数以保持一致性,因此,operator<<
的定义在您阅读时似乎就像在课堂上一样。另外,可能有些奥秘的查找约束使此操作变得很方便(因为以这种方式定义的friend
函数只能由ADL找到),尽管我想不出什么。>