/*
友元类 :
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。*/
#include<iostream>
using namespace std;
class A {
friend class B;//友元类写哪都行,public/private/函数外都可以。一般写在外/public
public:
A(int xx) :x(xx) {};
~A() {};
void display()
{
cout << x << endl;
}
int get() { return x; }
private:
int x;
};
//B是组合类且是A的友元类
class B {
public:
//B(int xx):a.x(xx){};错误,这样定义构造函数与A定义的构造函数冲突二者只存其一
B(A q) :a(q) {};//所以这里的初始化一定用组合类的方法
~B() {};
void set(A &a,int i);//因为类A已经是私有成员但不能想当然以为set函数可以访问A类(只是组合类)
void display(A &a);//因为B是A的友元类且A为私有成员,因此入口参数A &a可以不写
private:
A a;
//int d;
};
void B::set(A &a,int i)
{a.x = i;};
void B::display(A &a)
{ a.display();}
int main()
{
A a(4),w(6);
cout << "A类w的值为";
w.display();
B c(w);
c.set(w, 4);//通过建立引用通过B类函数直接修改A类的值
cout << "A类w的值为";
w.display();
cout << "B类w的值为";
c.display(w);
system("pause");
return 0;
}