【发布时间】:2014-10-23 08:17:06
【问题描述】:
我正在阅读这样的代码:
class Member
{
public:
friend std::istream& operator>>(std::istream& in, Member& m)
{
in >> m.name >> m.bYear >> m.bMonth;
return in;
}
friend std::ostream& operator<<(std::ostream& out,const Member& m)
{
out << m.name << " " << m.bYear << "." << m.bMonth;
return out;
}
private:
std::string name;
int year;
int month;
};
我以前从未见过这种方式。使用friend 在类体内定义非成员函数是一种好习惯吗?有什么优点和缺点吗?
【问题讨论】:
-
这是我自己经常做的事情(对于琐碎的内联 I/O),因为它表达了函数与类之间的密切联系。我没有看到任何真正的负面因素这样做。无论如何,您都必须在类定义中声明函数。
-
如果类和它的友元都是模板,那么在类外定义友元会变得相当麻烦。 stackoverflow.com/questions/16814037#16814372
-
@Theolodis:不是重复的,
friend的使用不在讨论中。 -
@JamesKanze:也许我们对“凌乱”的定义不同。必须在类之前声明函数模板,并且(在大多数情况下)还要在函数之前声明类模板,这对我来说确实很麻烦。
-
@JamesKanze:我的(有点切题的)评论是,如果它们是模板,那么由于需要额外的声明,它会变得混乱,正如我链接到的问题所证明的那样。如果它们不是模板,那么您是对的,将接口与实现分开不会再混乱(根据个人喜好,也许更可取)。抱歉,如果我对稍微超出问题范围的内容发表评论而造成混淆。
标签: c++