首页 > 代码库 > 友元函数

友元函数

友元

  方式:1、全局函数友元(外部);2、成员函数友元;3、类友元。

特点:1、单向;友元不具有传递性、友元不具有继承性。

对象的成员有数据和方法,一般将数据设置为private或保护,由于类的封闭性和隐藏性;将方法设置为public。只有通过对象调动一般方法来访问其私有成员。

this指针存在于非静态成员函数中,则静态成员函数没有this指针,对于静态成员函数既可以在类里声明,在类外定义,也可以在类里定义。

友元函数

要解决静态成员函数访问其私有成员,则以将static函数前加friend修饰符,变为友元函数。友元函数既可以在类里声明,在类外定义,还可以在类里定义。

友元函数是在类定义中由关键字friend修饰的非成员函数。友元函数不是本类的成员函数,则调用时不能通过对象调用,直接用函数调用。

静态成员函数在调用时既可以通过对象调用,还可以通过函数名直接调用。

友元关系

1、将一个非成员函数getval()声明为类Test的友元函数,使得该非成员函数可以访问类Test的私有成员。

1、截图如下:在类里声明友元函数,在类外定义

技术分享

 技术分享

2、在类里声明友元函数,并定义

 技术分享

 

//先将非成员函数在类声明;注意class Test;应在其之前声明,避免编译出错

 技术分享

 技术分享

 

 

结果:(两次的结果为)

 技术分享

成员函数友元

3、将一个类Test的某成员函数声明为Base类的友元函数,使得可以通过 Test类的这个成员函数访问类Base的私有成员

 技术分享

技术分享

注意:被屏蔽的代码为编译出错代码,原因是由于Test类中的void getnum(Base &it)的成员函数被未设置为Base类的成员函数友元,则之后访问Base类中的私有成员,则会访问失败。

Tes类中不能在声明getval(Base &x)的时候进行定义,因为此时的Base类并未定义,只是在Test类之前进行了声明而已。

类友元(Test类声明为Base类的友元类,使得可以通过类Test对象访问类的私有成员)

格式为:

 class B

{

  ...

  friend class A;

}

技术分享

 技术分享

结果为:技术分享

注意:在Tes类中不能在声明getval(Base &x)的时候进行定义,因为此时的Base类并未定义,只是在Test类之前进行了声明而已。

 

类中声明的函数相对于类来说有三层意思:

1、有this指针;2、函数在类的作用域中(成员函数);3、可以访问类中私有部分(friend友元函数);4、可以被继承

非静态成员函数:1234

静态成员函数:234

友元函数:3

 

 

 

 

友元函数