友元friend

C++中,类的数据成员的访问控制权限一般为private,外部无法直接访问。但“友元”机制则打破了这种限制,使得非成员函数可以访问私有数据。友元通常有三种形式:友元函数、友元类以及友元成员函数。像我这种菜鸟只能说友元函数是最常见的一种。

对类来说,友元函数是非成员函数,但拥有和成员函数相同的访问权限。友元函数的实现很简单,只需要将函数原型放在类声明中,并用关键字friend进行修饰即可,而在定义时则不需要使用friend

友元函数在重载二元运算符的情况中用的比较多。二元运算符需要两个操作数,当其中一个操作数是非类的项时,需要友元函数。例如有自定义类T的对象AB,普通变量b,则在重载乘法运算符下,A = B * bA = b * B对应的函数调用分别是 A = B.operator*(b)A = operator*(b,B)。前者是成员函数,第一个操作数必须是类对象;后者要使用非成员函数来实现,但非成员函数无法直接访问类的私有部分,因此,需要使用友元。如下:

template<class A>
class T
{
public:
    //...
    T operator*(A a);
    friend T operator*(A a,const T &t);
    friend ostream & operator<<(ostream &os,const T &t);
    T operator+(const T &t);    
    //friend T operator+(const T &t1, const T &t2);
private:
    //...
}

如果两个操作数都是类对象,则使用成员函数或者非成员函数友元形式均可。前者的操作数是通过this指针隐式传递以及函数参数显式传递;后者的两个操作数均通过参数来传递。这种情况下,不能同时使用这两种格式,否则会出现二义性错误。

友元的第二种形式是友元类。当is-a关系或者has-a关系不适合描述两个类之间的联系,但这两个类又存在某种关联时可以使用友元类。将类A声明为类B的友元类,则类A可以访问类B的私有部分。有时候,类A中只有一些方法需要访问类B的私有部分,则可以只将这些方法设置为类B的友元,对于类B来说,即友元成员函数。这种情况下,需要小心排列相关声明和定义顺序。

总之,友元没有违背面向对象的编程思路,而是提供了更加灵活的编程方式。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务