您的位置:首页 > 编程语言 > C语言/C++

浅谈C++中的友元关系

2012-10-19 10:31 411 查看
在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

 

在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

#include <iostream>

 

 using namespace std;

 

 class B;

 

 class A{

     private:

         int x;

     public:

         A();

         void display(B &);

 };

 

 class C;

 

 class B{

     private:

         int y;

         int z;

     public:

         B();

         B(int, int);

     friend void A::display(B &);//友元成员函数

     friend void display(B &);//友元函数

     friend class C;//友元类

 };

 

 class C{

     private:

         int sum;

         void calc(B &);

     public:

         C();

         void display(B &);

 };

 

 //必须在友元关系的类后进行定义

 void display(B &v)//友元函数

 {

     cout << v.y << " " << v.z << endl;

 }

 

 A::A()

 {

     this->x = 0;

 }

 

 void A::display(B &v)//友元成员函数

 {

     this->x = v.y + v.z;

     cout << this->x << endl;

 }

 

 B::B()

 {

     this->y = 0;

     this->z = 0;

 }

 

 B::B(int y, int z)

 {

     this->y = y;

     this->z = z;

 }

 

 C::C()

 {

     sum = 0;

 }

 

 void C::display(B &v)

 {

     this->calc(v);

     cout << sum << " = " << v.y << " + " << v.z << endl;

 }

 

 void C::calc(B &v)

 {

     sum = v.y + v.z;

 }

 

 int main()

 {

     A a;

     B b(2, 3);

     display(b);

     a.display(b);

     C c;

     c.display(b);

    

     return 0;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ class c