C++友元用来破坏数据封装,分为三种:友元类、友元普通函数和友元成员函数。
#include<iostream>
using namespace std;
class Husband;
class Boss
{
public:
Boss()
{
cout << "Boss()" << endl;
}
void giveSalary(Husband &h);
//void giveSalary(Husband &h)//由于该函数声明为Husband类的友元成员函数,所以Boss可以访问Husband的私有属性,但是此处不能直接定义函数,因为在该函数体中还未能找到Husband类实体,只能先声明,然后在类外面定义
//{
// h.balance+=1000;
//}
void getSalary(Husband &h);//由于该函数并未声明为Husband类的友元成员函数,所以Boss不能访问Husband的私有属性
//void getSalary(Husband &h)
//{
// h.balance=0;
//}
};
class Husband
{
friend class Wife;//友元类
friend void giveInterest(Husband &);//友元普通函数
friend void Boss::giveSalary(Husband &);//友元成员函数
public:
Husband()
:balance(100)
{
cout << "Husband()" << endl;
}
void out()
{
cout << "I have:" << balance << endl;
}
private:
int balance;
};
class Wife
{
public:
Wife()
:balance(0)
{
cout << "Wife()" << endl;
}
void getMoney(Husband &h)
{
balance += h.balance;
h.balance = 0;
}
void giveMoney(Husband &h)
{
h.balance += balance;
balance = 0;
}
private:
int balance;
};
void Boss::giveSalary(Husband &h)
{
h.balance += 1000;
}
//void Boss::getSalary(Husband &h)
//{
// h.balance = 0;
//}
void giveInterest(Husband &h)
{
h.balance += 500;
}
void main()
{
Wife w;
Husband h;
h.out();
w.getMoney(h);
h.out();
giveInterest(h);
h.out();
Boss b;
b.giveSalary(h);
h.out();
}
友元的继承性:父类的友元类也是子类的友元类,但是该友元类只能访问子类中由父类继承而来的私有成员,子类本身的私有成员不能访问。
class A
{
friend class C;
private:
int m_val;
};
class B:public A
{
private:
int val;
};
class C
{
public:
void c_change_a(A &a)
{ cout << (a.m_val = 5) << endl; }
void c_change_b(B &b)
{
cout << (b.m_val = 7) << endl;//ok,友元类只能访问子类中由父类继承而来的私有成员
//cout << (b.val = 7) << endl;//error,友元类对于子类本身的私有成员不能访问
}
};
void main()
{
A a;
B b;
C c;
c.c_change_a(a);
c.c_change_b(b);
}