C++友元

来源:互联网 发布:毕厶迦男装淘宝店 编辑:程序博客网 时间:2024/05/22 17:22

  对友元函数的概念总是模糊不清,每次复习基础都觉得已经懂了,结果用的时候又不知道怎么用了。

比如说在类内定义了一个友元函数,我就总是会想到:这个函数是哪个类的成员函数,如何确定两个累是“朋友”?

这种想法困扰了我很长时间,其实还是概念不清,其实,友元的本意是让其他的非类成员也能访问该类的成员。友元函数百科

#include <cstdlib>#include <iostream>#include <string>#include <ostream>using namespace std;class A{     public:             int a;                 A(){          }          void say(){               cout<<"lala";           }          friend ostream& operator<<(ostream& out,const A& m)          {               out<<m.a;               return out;                             }};int main(int argc, char *argv[]){/*    int i=0,j=1,k=2;    int *ptr[3];    ptr[0]=&i;    ptr[1]=&j;    ptr[2]=&k;    for(int m=0;m<3;m++)    cout<<*ptr[m]<<endl;    system("PAUSE");    return EXIT_SUCCESS;    */    A *p=new A[10];    for(int i=0;i<10;i++)       p[i].a=i;    for(int i=0;i<10;i++)       cout<<p[i];    system("PAUSE");    return EXIT_SUCCESS;}

自己写了一个<<重载函数,初始版本是没有写friend关键字的,结果编译器总是报错:

std::ostream& A::operator<<(std::ostream&, const A&)' must take exactly one argument

意思是该函数只能有一个参数

其实真正的原因是:

重载操作符必须符合内建的模型,也就是说,重载操作符后的行为要与原来一致。

<< 操作符是一个二元操作符,它只接受二个参数,调用时的形式为:第一个参数<<第二个参数,如:
ostream& operator<< (ostream& os, const Point& pt);
的调用形式为: os<<pt (返回引用是为了可以连写:os << pt1 << pt2; )

而如果要将<<操作符定义为类的成员函数,那么你就只能给一个参数(因为编译器展开类成员函数时将*this对象作为第一个参数),如果你给两个参数,那最后<<操作就变成三元的了,与原模型不符,所以编译器给出“overload.cpp:17: error: ‘std::ostream& Point::operator<<(std::ostream&, const Point&)’ must take exactly one argument”的错误。

如果你偏要定义成成员函数,并正确的只给出一个参数ostream&,那么最后的调用式就只能写成:

    pt << std::cout;

那么你是不是觉得“违反了标准”呢(虽然程序可正确运行)?而且如果返回ostream&,就无法连写了!


0 0
原创粉丝点击