C++友元

友元的分类

在C++的面向对象中,友元分为友元函数与友元类,它们的主要功能都是使得某个函数或者某个类中的成员函数对另一个类的私有成员进行访问,下面我们分别对这两种东西进行简述。

友元函数

友元函数顾名思义就是程序中某一个外部函数是作为某个class类的“朋友”,既然是朋友,就可以在这个class外部对它的private与protected成员进行访问,但是在声明这个外部函数的时候确不能在class外部声明,必须在其内部在返回类型之前使用friend关键字对其进行声明:

class Column{
public:
Column(){ high = 0; radius = 0; }
Column(int,int);//声明有参构造函数
friend int area(Column t);//声明友元函数:计算圆柱体面积
private:
int high;
int radius;//声明两个私有成员
};
Column::Column(int h, int r){
high = h;
radius = r;
}
int area(Column t){
return t.high*(3 * t.radius*t.radius);//对象t调用high、radius私有成员
}
int main()
{
Column col(3, 2);//实例化一个对象,high=3,radius=2
int a = area(col);//area()是外部函数,所以不能使用.操作符直接调用
cout << a << endl;
return 0;
}

上面代码中area()是我们定义的友元函数,对其我们可以看出一下几点:
  1. 在area()函数中的对象调用了其所在类的私有成员,这在非友元函数中是无法实现的。
  2. area()函数声明在Column类之中,可以在class内部或者外部对其定义,但是在类外部对其定义时不能有"class::"这个标记因为它是非成员(non-member)函数,这个标记只是在类外部定义其成员函数时所用。
  3. 在main()函数中我们对area()进行了调用时,使用的是a=area()这个形式,可见无法使用像对象一样的.area()或者->area()这种形式,刚刚也说了它是non-member函数,使用对象调用是没有意义的。

友元类

友元类顾名思义就是某一个类是另一个类的“朋友”,它也是使用friend关键字在一个类中进行说明,比如说我们这里有两个类,我们把它们叫做A、B两个类:

class B;//声明B类的空原型,没有会报错!
class A{
public:
A(){};
int area(B);//以B类对象为参数
};
class B{
public:
B(){};
B(int a, int b){ //有参构造函数为x,y赋值
x = a;
y = b;
}
friend class A;//说明A是B的友元类
private:
int x;
int y;//只能内部访问的私有成员
};
int A::area(B b){
return b.x + b.y;//b调用了x,y这两个私有成员
}

我们由上面的代码来理解友元类:
  1. 我们可以看见在A类里有一个area()成员函数,它的参数是B类的一个对象,并且在定义里面看得到我们调用了b这个对象所在类的两个私有成员,这是因为在B类里面有一句"friend class A"语句,这句话说明了A是B的”朋友“,所以A类的成员函数中的B类对象可以调用B类的私有成员。
  2. 刚刚我们在B类中说明了”A类是B类的朋友“,但这并不代表B类也是A类的朋友,意思就是如果我们在B类定义一个成员函数并不能让A类的对象调用其私有成员,除非在A类中加上一句"friend class B"语句,因为友元关系不是相互的
  3. 大家可以看到上面代码的第一行声明了B类的一个空原型,这个是必需的,因为在接下来的A类之中引用了B类的名字,如果没有那一行代码就会报错(当然把B类写在A类之前也能够正常编译,但是在实际项目中先声明类的空原型是个很好的习惯)。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值