友元基本概念:
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);
}