友元函数与普通的非成员函数不同,它可以访问类的私有成员。

  • 友元函数不是成员函数,因此不能使用成员运算符.来调用
  • 但它与成员函数的访问权限相同

看到上面第二条我天真的理解成了,在友元函数定义中也可以向成员函数那样直接使用类中的变量呢,结果编译器就啪啪啪的打了我的脸。
我在一个<<运算符重载友元函数中这样使用的类变量:

1
2
3
4
5
6
7
8
9
10
// friend functions
std::ostream & operator<<(std::ostream & os, const Stonewt & st)
{
if(st.status == STN)
std::cout << st.stone << " stone, " << st.pds_left << "pounds";
else if(st.status == PDS)
std::cout << st.pounds << " pounds";
else
std::cout << "Incorrect status";
}

其中条件判断中那句

1
if(st.status == PDS)

编译器表示找不到变量PDS的定义,于是我才意识到

毕竟你友元函数不是成员函数,毕竟你的定义也没有使用类似Time::一类的限定符,你只是个朋友而已啦,不能随便用人家的东西,虽然你是朋友,而且原型写在人家那里。所以你的优惠就是可以通过你的朋友知道人家的隐私,比如使用朋友的成员运算符看人家隐私啦,能给你看就不错咯~还算当你是friend。

所以上面代码将PDS改成Stonewt::PDS就可以了。
还是朋友,还是要客气点。

Comments

2016-02-26