C++被设计成允许非成员函数做一些在其他语言中需要成员函数的事情。friend函数与成员函数非常相似,因为它可以在类作用域中定义。另外(这可能会令人困惑)如果你 only 在类作用域中声明friend函数,它只能通过传递该类的对象来访问。
struct printme {
friend std::ostream &operator<< ( std::ostream &os, printme const & )
{ return os << "hello"; }
friend void named_friend( printme const & ) {}
};
std::cout << printme(); // OK
named_friend( printme() ); // OK
void (*fn_ptr) = named_friend; /* function not found
it can only be found by association with printme */
3条答案
按热度按时间0ejtzxu11#
C++被设计成允许非成员函数做一些在其他语言中需要成员函数的事情。
friend
函数与成员函数非常相似,因为它可以在类作用域中定义。另外(这可能会令人困惑)如果你 only 在类作用域中声明friend
函数,它只能通过传递该类的对象来访问。虽然这个微妙的规则一开始很奇怪,但它反映了非成员函数也可以被类封装的思想。
有关更多信息,请阅读argument-dependent lookup(ADL)。
6yt4nkrj2#
我们通常以如下方式使用〈〈:
如果你让operator〈〈()成为你类的成员函数,你必须使用以下语法来调用operator〈〈()
你想这样做吗?如果它对你没问题,你可以让它成为一个成员函数。
如果你想要
pxiryf3j3#
下面是一个例子:
然而,根据我的经验,不要这样做。Oveloading在学术上是不错的,但是它使搜索应用程序以寻找其实现变得困难,甚至理解〈〈已经被重载。我总是使用
cout << myobject.tostring()
形式的东西