友元在类中的使用一般分为两种: (1) 友元类 (2) 友元函数

关于友元类: 友元类的使用和声明极为简单,只需在需要访问的类中加上friend class Classname 即可 。这样被声明的友元类即可访问声明处的类的所有成员, 同时声明的位置不限只需要在类中即可。

//     Tv 是一个类,而Remote则是Tv的遥控器,很显然Remote需要使用Tv
//     中的数据进行操作,此时可声明为友元类。
#ifndef TV_H_
#define TV_H_

class Tv{
private:
				int state ;
				int volume ;
				int maxchannel ;
				int channel ;
				int mode ;
				int input ;
	public:
				class friend Remote ;  
				// 声明友元类 ,Remote类可以直接访问Tv类的成员
				//   在类中任何地方声明皆可
				statements ;
};

关于友元函数: 实际上在大多数情况下,类中的数据交互只在几个函数间,太多的数据交互反而增加了错误的可能;所以在只有少量的数据交互时,不需要声明友元类,使用友元函数就可以了。 (1) 友元函数作为类的成员 还是以之前的Tv与Remote为例: 如果说很多关于Tv本身的操作都被封装成了函数,外部的Remote类只需要 调用其函数就可以改变Tv的状态,且只有少部分数据需要同外界的类直接 交互。那么,这时最好的方式就是使用为类成员的友元函数。

	class Tv
	{
		private:
				int state ;
				int volume ;
				int maxchannel ;
				int channel ;
				int mode ;
				int input ;
	    public:
				friend void Remote::set_channel(Tv & tv , int c) ;
				//       声明友元函数,这个函数是Remote类的成员
				//       在声明后Remote类可以直接通过set_channel函数进行操作
				//       而不需要使用友元类
				statements of funcs in the Tv class ;
		}

但注意这里会遇到一个声明顺序的问题! 由于在tv类中有着remote类的一个具体实现的函数声明,故而关于 remote类的声明需要放在tv类的前面!同时tv类需要预声明:

			class Tv ;
			class Remote { ...... } ;
			class Tv{ ...... } ;

(2) 友元函数作为普通函数 在部分情况下,数据间的共享或者同步,不是发生在类间的, 而是通过使用外部的函数进行。那么则是需要使用,普通函数作为 友元函数。 在需要同步或共享的类的类中声明普通函数的友元,在普通函数实现 数据的同步与共享,犹如一个第三方的接口。