1、友元函数
类中私有和保护的成员在类外不能被访问。
友元函数是一种定义在类外部的普通函数,其特点是能够访问类中私有成员和保护成员,即类的访问权限的限制对其不起作用。
友元函数需要在类体内进行说明,在前面加上关键字friend。
一般格式为:
friend FuncName();
友元函数不是成员函数,用法也与普通的函数完全一致,只不过它能访问类中所有的数据。友元函数破坏了类的封装性和隐蔽性,使得非成员函数可以访问类的私有成员。
一个类的友元可以自由地用该类中的所有成员。
class A{
float x,y;
public:
A(float a, float b){ x=a; y=b;}
float Sum(){ return x+y; }
friend float Sum(A &a);
};
float Sum(A &a)
{ return a.x+a.y; }
void main(void)
{ A t1(4,5),t2(10,20);
cout<<t1.Sum()<<endl;
cout<<Sum(t2)<<endl;
}
|
有关友元函数的使用,说明如下:
友元函数不是类的成员函数
友元函数近似于普通的函数,它不带有this指针,因此必须将对象名或对象的引用作为友元函数的参数,这样才能访问到对象的成员。
友元函数与一般函数的不同点在于:
友元函数必须在类的定义中说明,其函数体可在类内定义,也可在类外定义;
它可以访问该类中的所有成员(公有的、私有的和保护的),而一般函数只能访问类中的公有成员。
class A{
float x,y;
public:
A(float a, float b){ x=a; y=b;}
float Getx(){ return x; }
float Gety(){ return y; }
float Sum(){ return x+y; }
friend float Sum(A &);
};
float Sumxy(A &a){ return a.Getx()+a.Gety(); }
//float Sumxy(A &a){return a.x+a.y; }
float Sum(A &a){ return a.x+a.y; }
void main(void)
{ A t1(1,2),t2(10,20), t3(100,200);
cout<<t1.Sum()<<endl;
cout<<Sum(t2)<<endl;
cout<<Sumxy(t3)<<endl;
}
|
友元函数不受类中访问权限关键字的限制,可以把它放在类的私有部分,放在类的公有部分或放在类的保护部分,其作用都是一样的。换言之,在类中对友元函数指定访问权限是不起作用的。
友元函数的作用域与一般函数的作用域相同。
谨慎使用友元函数
通常使用友元函数来取对象中的数据成员值,而不修改对象中的成员值,则肯定是安全的。
大多数情况是友元函数是某个类的成员函数,即A类中的某个成员函数是B类中的友元函数,这个成员函数可以直接访问B类中的私有数据。这就实现了类与类之间的沟通。
注意:一个类的成员函数作为另一个类的友元函数时,应先定义友元函数所在的类。
class B ; //先定义类A,则首先对类B作引用性说明
class A{
...... //类A的成员定义
public:
void fun( B & );//函数的原型说明
};
class B{ ......
friend void A::fun( B & );//定义友元函数
};
void A::fun ( B &b) //函数的完整定义
{
...... //函数体的定义
}
|
class B; //必须在此进行引用性说明,
class A{
float x,y;
public:
A(float a, float b){ x=a; y=b;}
float Sum(B &); //说明友元函数的函数原型,是类A的一成员函数
};
class B{
float m,n;
public:
B(float a,float b){ m=a;n=b; }
friend float A::Sum(B &);//说明类A的成员函数是类B的友元函数
}
float A::Sum( B &b) //定义该友元函数
{ x=b.m+b.n; y=b.m-b.n; }
void main(void)
{ A a1(3,5);
B b1(10,20);
a1.Sum(b1); //调用该函数,因是类A的成员函数,故用类A的对象调用
}
|
阅读(366) | 评论(0) | 转发(0) |