类的主要特点之一是信息隐藏和封装,即类的私有成员和保护成员只能在定义的范围内使用,也就是说私有成员和保护成员只能通过类的成员函数来访问。但是,有时候我们在类外也需要访问私有成员数据或保护成员数据怎么办。这时我们就要通过友元函数来开后门了。
友元函数
友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但是它可以访问该类所有的成员,包括私有成员,保护成员和公有成员。
说明:
1)友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。
2)因为友元函数不是类的成员,所以它不能直接访问对象的数据成员,也不能通过this指针访问对象的数据成员,它必须通过作为入口参数传递进来的对象名(或对象指针,对象引用)来访问该对象的数据成员。
1.非成员函数声明为友元函数
为什么要引入友元的机制?
友元机制是对类的封装机制机制的补充,一个类可以赋予某个函数访问它的私有成员的权限。声明一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而提高程序运行的效率。
2.成员函数声明为友元函数
除了一般的非成员函数可以作为某个类的友元外,一个类的成员函数也可以作为另外一个类的友元,它是友元函数的一种,称为友元成员函数。友元成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问friend声明语句所在类对象的所有成员,这样能使两个类相互合作,配合工作,完成某一任务。
说明:
1)一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。比如上方程序定义
friend void circle::show_circle(point &p);
这句代码功能是声明一个circle的成员函数,show_circle是point的友元函数我们的成员函数不能在类内使用只能在类外使用。
友元类
不仅函数可以作为一个类的友元,一个类也可以作为另外一个类的友元,称为友元类。友元类的说明方法是在另外一个类说明加入语句。
上面可以看出友元类比友元函数强大,所以我们可以直接定义友元类来替代友元函数 。