友元不仅能访问到具有私有权限饿成员,具有public和protected权限的成员也能够访问
第一部分 --- 全局函数做友元
一.复习:成员属性的三种权限
1.public权限:成员属性既能从类内访问也能够从类外访问
2.private权限:成员属性只能从类内访问
3.protected权限:成员属性可从类内也可从类外访问,但从类外访问只有一种方法:继承中的子类访问父类中有protected权限的成员属性
二.对上面的补充 --- 友元技术的出现
有时候我们会想从类外访问其中具有私有权限的成员属性,为了实现这个目的人们发明了友元
通过将类外的函数或类变为我们要访问的对象的友元(good friend)的方式,使得它们能够去访问这个对象中具有私有权限的成员属性了
三.友元技术的使用
1.友元关键字:friend
void goodGay(Building *building) : 这个是一个全局函数(在所有类和函数的括号外的函数)的声明。当我们将这个函数声明放在一个类中,且在在函数声明前加上friend友元关键字来修饰这个它并在结尾加上表示代码结束的分号;后 --- 这个全局函数就会成为任何通过这个类创建的对象的友元了。
注意这行代码必须写在类的括号内的最开头
此时作为友元的全局函数就能够正常的访问
第二部分 --- 类做友元
做友元的目的
补充内容:声明与实现
在c++中类和函数一样也可以拓展为两部分:
1.我们最常写的实现部分 --- 既有创建函数(关键字+函数名...)也有函数的实现(即函数下面的花括号)
2.方便使用的声明部分 --- 函数的声明部分就是将函数实现的花括号部分内容去掉,然后在创建函数部分的后面加上表示代码结束的 ; 分号,如上图。
void fun(); // 函数的声明
void fun()
{
}
//上面这两部分组合起来就是函数的实现
//类也是同理的
class abb; // 这个是类的声明
class abb
{
}
//上面这两部分组合起来就是类的实现
声明部分的作用是什么呢?
我们先在任意位置写上声明部分,然后再在任意位置写上实现部分
当编译器执行代码执行到声明部分的时候,它就会自动跳转到对应的实现部分并执行实现部分的代码,执行完后再跳转回来继续执行声明部分后面的代码。
成员函数的类内声明与类外实现
如标题所说,成员函数是可以在类内声明,类外实现的,步骤如下:
1.成员函数在类内正常的写权限,只不过函数的实现部分被改为了函数的声明:
函数返回类型 函数名(函数形参);
2.在类外我们开始写成员函数的实现
一.首先第一步要做的就是告诉编译器这个成员函数的返回类型,如果没有返回类型的话(如构造函数和析构函数)可以不用写
二.我们要告诉编译器这个处于类外的成员函数是属于哪一个类的,方式如下:
在成员函数的返回类型后面加上 类名::函数名(函数形参)
三.在函数底下加上花括号,并在花括号里开始写函数的实现部分
如下图示例:
(ps:在类外写的成员函数的实现中对成员属性的访问算作类内访问)
友元类的创建方法:
在一个类A的括号内的最顶端加上类B的声明,并用friend修饰这个函数声明,我们就可以使得类B成为类A的友元
当类B成为类A的友元之后,类B的成员函数都可以访问类A中具有私有权限的成员属性了
第三部分 --- 成员函数做友元
其它的部分和上面的两小节没有什么区别
让成员函数作为类的友元也需要将成员函数的声明写在对应类的括号里的最上方,然后再用 friend 关键字修饰这个函数声明,
不过!特殊的一点是我们想做的是让成员函数作友元,所以我们需要告诉编译器我们写的这个函数是哪一个类的,所以上面那些写完之后我们还需要在函数声明中加上:
成员函数所属的类名::
这个加在成员函数的返回类型和函数名之间