标签:
友元
方式: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、可以被继承
非静态成员函数:1、2、3、4
静态成员函数:2、3、4
友元函数:3
标签:
原文地址:http://www.cnblogs.com/Lotusbleu/p/4262586.html