相信大家都会有点小疑问?何为友元函数难道是friend?那么他又是怎样定义的呢?表现形式是什么?关键字又是什么呢?友元函数与类的成员函数区别?
下面就一一给大家介绍一下揭秘中。。。。。。。?
友元函数的定义
C++编程中如果需要访问非本类的私有成员,那么就需要用到友元。否则私有成员是无法被外部直接访问的,而友元可以被定义为友元函数和友元类,即指定某函数或类直接访问私有类。则具体形式如下:
1、C++编程中如果需要访问非本类的私有成员,那么就需要用到友元。否则私有成员是无法被外部直接访问的,而友元可以被定义为友元函数和友元类,即指定某函数或类直接访问私有类。则具体形式如下:
class 类名{public: friend class 友元类名; friend 类型 友元函数名;}
这样定义后友元类和友元函数就可以直接访问该类的私有函数,需要注意的是友元仅为单向,即B是A的友元,但A是不能访问B的私有变量,友元也不可在子类被继承。
2、例子中友元函数直接操作类的私有变量a、b完成相加。友元函数或友元类一般使用在需要频繁操作某类的私有变量或者对计算效率要求较高的情况下,有时时一些重载操作符也可以使用友元来完成。
估计可能有些人有点萌了,还是来个实例吧
看看友元函数到底长什么样子?
代码如下所示
语法:
声明: friend + 普通函数声明
class Coordinate{
/**friend关键字**/
friend void printXY(Coordinate &c);
public:
Coordinate(int x,int y);
private:
int m_X;
int m_Y;
};
通过friend关键字直接访问私有成员代码传如对象名而非地址
void printXY(Coordinate &c)
{
cout<<c.m_X<<c.m_Y;
}
int main(void){
/**传入对象而非地址**/
Coordinate coor(3,5);
printXY(coor);
return 0;
}
成员函数
成员函数
class Coordinate{
friend void Circle::printXY(Coordinate &c);
public:
Coordinate(int x,int y);
private:
int m_X;
int m_Y;
};
class Circle {
public:
void printXY(Coordinate &c){
cout<<c.m_X<<c.m_Y;
}
};
测试类
int main(Void){
Coordinate coor(3,5);
Circle circle;//实例化
//调用printXY方法传入Coordinate对象
circle.printXY(coor);
return 0;
2使用友元函数的优缺点
2.2.1优点:能够提高效率,表达简单、清晰。
2.2.2缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
3.友元函数的使用
3.1友元函数的参数:因为友元函数没有this指针,则参数要有三种情况:
3.1.1 要访问非static成员时,需要对象做参数;
3.1.2 要访问static成员或全局变量时,则不需要对象做参数;
3.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
3.2友元函数的位置
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
3.3友元函数的调用
可以直接调用友元函数,不需要通过对象或指针
4.友元函数和类的成员函数的区别
4.1 成员函数有this指针,而友元函数没有this指针。
4.2 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
有兴趣的扫码加群讨论!直接扫码进入!
转载请注明出处!谢谢合作!欢迎转载哈哈!