声明一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等,有两个公有成员函数ran、stop。cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROML类的一个对象,声明并实现这个类。
从实验题目中可以看到:Computer类 包含CPU,RAM,CDROM三个类的对象,如果直接在Computer的私有成员中定义这三个类的对象,显然类Computer内嵌了类CPU,RAM,CDROM的对象,但是Computer的成员函数却无法直接访问它们的私有成员,,所以要想让其能使用,就必须对那三个类分别声明Computer是它们的友元类。
友元函数:
在类中用关键字friend 修饰的非成员函数,可以是一个普通的函数,也可以是其他类的成员函数。
友元类:
若A类为B类的友元类,则A类中的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。其语法形式:
class B
{
... //B类的成员说明
friend class A;//A为B的友元类
};
注意点:
1.友元关系不能传递,不能是A是B的友元,B是C的友元,A和C之间没有说明,则不是友元关系;
2.友元关系是单向的,B是A的友元,B的成员函数可以访问A的私有和保护数据,但是A不能访问B的私有和保护数据;
3.友元关系是不能被继承的,及派生类无说明不是原来类的友元;
#include<iostream>
using namespace std;
class CPU
{
public:
friend class Computer;//声明Computer是CPU的友元类
private:
int i;
};
class RAM
{
public:
friend class Computer;//声明Computer是RAM的友元类
private:
int j;
};
class CDROML
{
public:
friend class Computer;//声明Computer是CDROML的友元类
private:
int k;
};
class Computer
{
public:
void ran(int a,int b,int c);
void stop();
private:
CPU cpu;
RAM ram;
CDROML cdrom;
};
void Computer::ran(int a, int b, int c)
{
cpu.i = a;
ram.j = b;
cdrom.k = c;
cout << a << b << c << endl;
}
void Computer::stop()
{
cpu.i = 0;
ram.j = 0;
cdrom.k = 0;
cout << cpu.i << ram.j << cdrom.k << endl;
}
int main()
{
Computer computer;
computer.ran(8,9,7);
computer.stop();
return 0;
}