C++之友元

来源:互联网 发布:ds cloud windows 编辑:程序博客网 时间:2024/05/01 16:09
1 友元函数
1 定义

友元函数是一种特殊的函数,它不是类的成员函数,但允许它访问类的私有类型数据和保护类型数据。

2 声明方式
class 类名称
//相关的类
{
type vars ;
......
public:
friend 函数类型 函数名称( ) ;
......
//声明友元
}
friend 函数类型 函数名称( )
{......}

3 特点
• 友元可以是一个一般的函数 (友元函数),也可以是另一个类的成员函数 (友元成员),还可以是整个的一个类(友元类,这时类中的所有成员函数都是友元函数)。
• 友元函数须在私有成员可被它访问的类中声明,而函数体则在类外声明。
• 友元函数虽然在类中声明,但它不是该类的成员函数,而是独立于任何类的一般的外界函数,它被允许访问该类的所有对象的私有成员。
• C++中使用友元是为了提高程序的运行效率。但为了确保数据的完整性及数据封装与隐藏的原则,应尽可能不使用或少使用友元函数。

#include<iostream>#include<string.h>using namespace std;class boy;class girl{private:char xm[8];int nl;public:girl(const char *xm1,int a){strcpy(xm,xm1);nl = a;}friend void prdata(const girl g,const boy b);};class boy{private:char xm[8];int nl;public:boy(const char *xm1,int a){strcpy(xm,xm1);nl = a;}friend void prdata(const girl g,const boy b);};void prdata(const girl g,const boy b){cout<<"xm:"<<g.xm<<endl;cout<<"nl:"<<g.nl<<endl;cout<<"xm:"<<b.xm<<endl;cout<<"nl:"<<b.nl<<endl;}int main(int argc,char *argv[]){girl g1("g1",20),g2("g2",21),g3("g3",22);boy b1("b1",10),b2("b2",11),b3("b2",12);prdata(g1,b1);prdata(g2,b2);prdata(g3,b3);return 0;}
友元实现了类之间的数据共享,但当类声明许多友元时,将破坏数据的隐蔽性和类的封装性,降低了程序的可维护性。
2 友元成员
一个类的成员函数作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的所有成员,还可以访问friend声明语句所在类对象中的所有成员。
这样能使两个类相互合作、协调工作,完成某一任务。
#include<iostream>#include<string.h>using namespace std;class girl;class boy{private:char *name;int age;public:boy(char *n,int d){name = new char[strlen(n)+1];strcpy(name,n);age = d;}void disp(girl &);~boy(){delete name;}};class girl{private:char *name;int age;public:girl(char *n,int d){name = new char[strlen(n)+1];strcpy(name,n);age = d;}friend void boy::disp(girl &);~girl(){delete name;}};void boy::disp(girl &x){cout<<"Boy\'s name is"<<name<<",age:"<<age<<endl;cout<<"girl\'s name is"<<x.name<<",age:"<<x.age<<endl;}int main(int argc,char *argv[]){boy b("Chen Hao",25);girl e("Zhang Wei",18);b.disp(e);return 0;}

3 友元类
一个类也可以作为另一个类的友元。
• 例如:
• class Y {
• //...
• };
• class X {
• //...
• friend Y;// 声明类Y为类X的友元类
• //...

• };
• 当一个类被说明为另一个类的友元时,它的所有成员函数都成为另外一个类的友元函数,也即作为友元类中的所有成员函数都可以访问另一个类中的私有成员。
 友元关系是单向的,不具有交换性。
 友元关系不具有传递性。

#include<iostream>using namespace std;class Myclass{private:int a,b,max,min;public:Myclass(int i,int j):a(i),b(j){max = (a > b)?a : b;min = (a < b)?a : b;}friend int Result(Myclass &x);};int Result(Myclass &x){return x.max*x.max - x.min*x.min;}int main(int argc,char *argv[]){Myclass n(3,4);cout<<Result(n)<<endl;return 0;}









原创粉丝点击