归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
没有存储汗水,就无法支取成长!
一起加油!
目录
一、前言:
二、友元函数:
💦例:友元函数的声明与使用——编写一个函数求屏幕上两点之间的距离。
🔑说明:
三、友元类:
💦友元类的定义和使用:
🔑说明:
四、总结注意:
五、共勉:
一、前言:
类很好地实现了封装和隐藏,一个类里的私有成员和保护成员只能由类内部的成员函数访问外部不能通过对象直接访问。但有时为了提高编程效率,需要允许一个函数或类访问另外一个类中的私有成员或保护成员,这时可将这些类或函数声明为类的友元。
二、友元函数:
可以把函数申明为一个类的友元,函数成为类的友元函数,它就可以访问类中的私有成员和保护成员。
友元函数在被访问类中的声明格式如下:
friend <返回值类型><函数名><(参数表)>;
💦例:友元函数的声明与使用——编写一个函数求屏幕上两点之间的距离。
#include<iostream>
#include<cmath>
using namespace std;
class Point{
private:
double x;
double y;
public:
Point(double px=0.0,double py=0.0):x(px),y(py){ }
~Point(){ }
void print(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
friend double Distance(Point a,Point b);
};
double Distance(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main(){
Point a(0.0,0.0);
Point b(1.0,1.0);
a.print();
b.print();
cout<<"两点距离为:"<<Distance(a,b)<<endl;
return 0;
}
🔑说明:
友元函数可以访问类中里的所有成员,但友元函数并不是类的成员函数,它在类的外部。当函数被声明为类的朋友后,它就成为类的友元函数,相当于类为它打开了一个“后门”,使得在友元函数中访问类的私有成员保护成员不再受到限制。
三、友元类:
友元类的声明方法与友元函数类似,友元类在被访问的类中的声明格式如下:
friend <类名>;
💦友元类的定义和使用:
#include<iostream>
#include<cmath>
using namespace std;
class A{
private:
double x;
double y;
public:
friend class B;
A(int px,int py):x(px),y(py){ }
~A(){ }
void print(){
cout<<"("<<x<<","<<y<<")";
}
};
class B{
private:
A a1,a2;
public:
B(A pa1,A pa2):a1(pa1),a2(pa2){ }
~B(){ }
void print(){
a1.print();
a2.print();
}
double len(A a1,A a2){
return sqrt((a1.x-a2.x)*(a1.x-a2.x)+(a1.y-a2.y)*(a1.y-a2.y));
}
};
int main(){
A a1(0.0,0.0);
A a2(1.0,1.0);
B b(a1,a2);
cout<<"线段:";
b.print();
cout<<"距离:"<<b.len(a1,a2)<<endl;
return 0;
}
🔑说明:
本例中类 A 描述的是二维坐标系中的一个点,类 B 是线段,在类 B 中有一个获取线段长度的公有方法,通过这个方法可以访问点对象的横纵坐标值(在一般情况下,在类外访问类对象的私有成员值是不允许的)。将类 B 声明为类 A 的友元后,类 B中的所有成员函数会自动变成类 A 的友元函数,就可以访问 A 中的私有成员。
四、总结注意:
- 关于友元,需要注意以下几点:
- ⚡友元关系不能传递。B 类是 A 类的友元,A 类是C 类的友元,如果没有特别声明,不能
推断 B类是 C类的友元; - ⚡友元关系是单向的。B 类是 A 的友元,B 类的成员函数就是 A 类的友元函数,可以访问A类中的私有成员和保护成员。但不能由此推断 A 类也是 B 类的友元,A 类的成员函数不能访问 B 类中的私有成员和保护成员。
五、共勉:
以上就是我对类和对象——(6)友元的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对类和对象的理解,请持续关注我哦!!!