友元基本概念:
1,把一个一般函数声明为一个类的友元函数
2,把一个类A的某几个成员函数声明为某个类B的友元函数
3,把一个类A声明为一个类B的友元类。
友元的作用:可以访问类B里所有的成员变量和成员方法,不管是public,protected,还是private。
1,把一个一般函数show声明为一个类的友元函数
#include <iostream>
using namespace std;class Test{friend void show(const Test &t);
public:Test(int d = 0) : data(d){}
private:void fun()const{cout << "fun:" << data << endl;}int data;
};//友元,即可以访问私有成员变量,也可以访问私有方法
void show(const Test &t){cout << "friend of Test:" << t.data << endl;t.fun();
}int main(){Test t(100);show(t);return 0;
}
2,把一个类A的fun成员函数声明为类Test的友元函数,但是类A的fun1函数不是类Test的友元函数,所以在fun1里不能够访问Test的私有成员。
#include <iostream>
using namespace std;class Test;class A{public:A(int d = 0) : data(d){}void fun(const Test &t);void fun1(const Test &t);private:int data;
};class Test{friend void A::fun(const Test &t);
public:Test(int d = 10) : data(d){}
private:int data;
};void A::fun(const Test &t){cout << t.data << endl;
}
void A::fun1(const Test &t){//编译不能通过,因为fun1不是class Test的友元函数。 //cout << t.data <<endl;
}
int main(){Test t(100);A a;a.fun(t);
}
3,把类B声明为一个类Test的友元类,因此,类B的所有public成员函数都是类Test的友元函数。
#include <iostream>
using namespace std;class Test;class B{
public:void fun1(const Test &t);void fun2(const Test &t);
};class Test{friend class B;
public:Test(int d = 0) : data(d){}
private:void pri()const{cout << "pri" << endl;}int data;
};void B::fun1(const Test &t){cout << t.data << endl;
}
void B::fun2(const Test &t){t.pri();
}int main(){Test t(10);B b;b.fun1(t);b.fun2(t);
}