C++友元


在类中有公用的成员,也有私有的成员,在类的外部,我们只能访问公用的成员,在类的成员函数里面才可以访问类的所有成员。


1.在C++中可以使用friend关键字来将函数、类声明为某个类的友元。


2.当我们将一个函数或者一个类声明为另一个类的友元的时候,就可以在这个函数或类内部对这个类的私有成员进行访问。


3.友元包括友元函数和友元类。我们可以将某一个函数声明为某一个类的友元函数,将某一个类声明为某一个类的友元类。


4.友元只能授予,不能索取,单向,不能传递。如果A是B的友元,B是C的友元,那么A不是C的友元。



友元函数


在类体中使用friend关键字对友元函数进行声明:友元函数的声明可以是任何访问限制的,公有的或者私有的都可以。


1.将非成员函数声明为友元:


friend void func();  //func为非成员函数,不属于任何类


2.将其他类的成员函数声明为友元:


friend void CTime::getNum(); //getNum为CTime类的成员。



友元类


在类体中使用friend关键字将某类声明为自己的友元类:


friend CTime;


下面我们在Cdate类里面声明了CTime为它的友元类,说明了CTime的成员函数可以访问CDate的私有成员,但是CDate类的成员函数并不能够访问CTime的私有成员。就好比我承认你是我的朋友,我愿意将我的隐私给你看,但你并不一定会认可我是你的朋友一样。


friend1.png


类的前置声明


我们这个类是看不到CTime这个类的声明的,但是我们又需要使用这一个类,我们可以包含这个类的头文件,比如#include”time.h”;但是这样是不好的,最好不要再头文件中包含别的头文件,可能会导致一些循环包含的问题。所以我们使用一种方法--类的前置声明。在需要使用这个类的头文件前面加上这个class 类名;就可以实现。


一般情况下,类要经过声明之后才能够使用。我们在使用一个类创建一个对象的时候,编译器要对类的对象进行内存的分配,它需要知道对象的大小,在分配的时候需要给它分配多大的空间。编译器只有在看到这个类体之后才知道对象有多大。当我们有了前置声明之后,就可以在其它类来使用这个类的引用或者指针。前置声明的使用智能在另外一个类中使用它的引用或者指针,因为引用和指针是固定大小的,是不能有执行需要了解声明的类的大小和成员的操作。而包含头文件就可以使用了。这里我们只是使用了CTime类的引用,但是在这个函数的实现文件里,由于我们需要访问它的成员,所以必须包含time.h,如下:


friend2.png


friend3.png


运行结果如下:display()函数是CDate类的成员函数,但是因为我们在CDate类里面声明CTime类为它的友元类,所以可以理解为CTime类的成员函数都已经是CDate类的友元函数,这些函数可以访问两个类的所有成员。


friend4.png


我们可以在上面看到虽然声明了友元类,但是需要访问两个类的成员函数只有一个,所以我们可以将CTime这个类的成员函数声明为CDate类的友元,display函数依旧可以访问两个类的成员。此时,仅仅使用类的前置声明已经不可以,我们需要包含Date.h。


friend5.png


缺点:面向对象的基本原则包括封装性和信息隐藏,而由于友元可以访问其他类的私有成员,这是对封装原则的一个破坏。友元可以有助于数据共享,可以提高程序效率。因此使用友元的时候要特别慎重。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

有一位课程导师想与你聊聊

客服热线 400-862-8862

回到顶部