C++友元函数和友元类

C++友元:

在类中有公用的成员,也有私有的成员,在类的外部,我们只能访问公用的成员,在类的成员函数里面才可以访问类的所有成员。

 

1.在C++中可以使用friend关键字来将函数、类声明为某个类的友元。

 

2.当我们将一个函数或者一个类声明为另一个类的友元的时候,就可以在这个函数或类内部对这个类的私有成员进行访问。

 

3.友元包括友元函数和友元类。我们可以将某一个函数声明为某一个类的友元函数,将某一个类声明为某一个类的友元类。

 

4.友元只能授予,不能索取,单向,不能传递。如果A是B的友元,B是C的友元,那么A不是C的友元。

·友元函数:

定义:在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数。类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。访问对象中的成员必须通过对象名。

作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。

将全局函数声明为友元的写法如下:

friend  返回值类型  函数名(参数表);

 

 

将其他类的成员函数声明为友元的写法如下:

friend  返回值类型  其他类的类名::成员函数名(参数表);

 

但是,不能把其他类的私有成员函数声明为友元。

声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
void setWidth( double wid ); };

完整代码如下:

#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   void setWidth( double wid );
};
 
// 成员函数定义
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程序的主函数
int main( )
{
   Box box;
 
   // 使用成员函数设置宽度
   box.setWidth(10.0);
   
   // 使用友元函数输出宽度
   printWidth( box );
 
   return 0;
}

代码运行结果:

 

·友元类:

一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法如下:

friend  class  类名;

代码示例:

#include <iostream>

using namespace std;

class Box
{
    double width;
public:
    friend void printWidth(Box box);
    friend class BigBox;
    void setWidth(double wid);
};

class BigBox
{
public :
    void Print(int width, Box &box)
    {
        // BigBox是Box的友元类,它可以直接访问Box类的任何成员
        box.setWidth(width);
        cout << "Width of box : " << box.width << endl;
    }
};

// 成员函数定义
void Box::setWidth(double wid)
{
    width = wid;
}

// 请注意:printWidth() 不是任何类的成员函数
void printWidth(Box box)
{
    /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
    cout << "Width of box : " << box.width << endl;
}

// 程序的主函数
int main()
{
    Box box;
    BigBox big;

    // 使用成员函数设置宽度
    box.setWidth(10.0);

    // 使用友元函数输出宽度
    printWidth(box);

    // 使用友元类中的方法设置宽度
    big.Print(20, box);

    getchar();
    return 0;
}

代码运行结果如下:

 总结:

1.必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分

2.友元函数不能直接访问类成员只能访问对象成员,访问对象中的成员必须通过对象名。

3.友元为单向

4.友元关系不能被继承,不能传递

 

posted @ 2019-09-29 18:30  Zzzxy  阅读(266)  评论(0编辑  收藏  举报