【C/C++学习】之友元

我们知道,在一个类中可以有公用的(public)成员和私有的(private成员)。在类外可以直接访问共有成员,对于私有成员,也可以通过调用公有成员函数的情况下进行访问,但只有类中的函数可以访问本类的私有成员,那有没有例外呢?C++中确实有这个例外,这个例外就是友元。

概念

友元可以访问与其有好友关系类中的私有成员。友元包括友元函数和友元类。友元机制是对封装机制的补充,利用此机制,一个类可以赋予某些函数访问它私有成员的特权。

友元函数

友元函数可以是类中的函数,也可以是类外的普通函数,但是不可以是静态函数

友元函数的声明:
位置:当前类体中。
格式:friend +函数类型+函数名(普通函数)
friend + 友元函数所在类名:成员函数名(但是一个类的成员函数作为另一个类的友元函数时,必须先定义这个类)

友元函数的定义:
类体外:同一般函数(函数名前不加类名::也不用加friend关键字)
类体内;函数名前加friend关键字(以区分类的成员函数)

友元函数没有this指针,它是通过入口参数来访问对象的数据成员的。

这样解释有点难理解,我们看一个例子:

class Human
{
public:
    Human(int age_in):age(age_in){};
    Human(Human&pp);
    static void ShowLove(int age){cout<<age<<endl;}
    friend int get_gender(Human&);//先进行说明,注意,没有this指针,所以通过入口参数传递
    int age;
private:
    int gender =1;
};
int get_gender(Human&gender_in){ //再进行定义,前面不需要加friend关键字
    return gender_in.gender;
}

友元函数可以做这样一个比喻,就好比一个函数,他事先在类中跟这个类打好招呼:
”hey,我是你的盟友,我想用一下你的private里的数据成员,能给我开个VIP会员么。”

类同意了他的请求,于是就跟他说:
“好呀,我记下了,以后只要是这个函数对我的对象的调用,我都同意”(friend int get_gender(Human&);)

函数又说:
“那能不能给我一个this指针呢?每次都通过对象名.成员的调用好麻烦呀!”

类:“兄弟,那我就帮不了你啦,this指针管得很死,只有我的非静态成员才有,你以后还是老老实实把地址通过形参传进来把。”

友元类

不仅可以将一个函数声明为一个类的“朋友”,而且可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。这时B类为A类的友元类。友元B中所有函数都是A类的友元函数,可以访问A类中的所有成员。

友元类的声明

friend class 类名; 
1
使用友元类比较方便,只要在类中声明这个“朋友”,接下来定义出来的这个“朋友”也就是友元类就可以使用该类的所有成员。

注意点:

1.友元关系是单向的,不具有交换性
即若类X是类Y的友元,但类Y不一定是类X的友元。(你的就是我的,我的还是我的)
2.友元关系不具有传递性
若类X是类Y的友元,类Y是类Z的友元,但类类X不一定是类Z的友元。
3.友元函数不可被继承
同理友元函数也不能被定义为虚函数。
4.友元可以使用的范围包括继承来的数据

class creature{
protected:
    int life =1;
};
class Human:protected creature
{
public:
    Human(int age_in):age(age_in){};
    Human(Human&pp);
    static void ShowLove(int age){cout<<age<<endl;}
    friend int get_gender(Human&);
    int age;
private:
    int gender =1;
};
int get_gender(Human&gender_in){
    return gender_in.gender+gender_in.life;
}


 

猜你喜欢

转载自blog.csdn.net/qq_35097289/article/details/99424802
今日推荐