《面向对象程序设计》课件第4章 友元.pptx
第4章友元4.1友元的概念和定义4.2友元函数4.3友元成员4.4友元类4.5友元综合举例十4.1友元的概念和定义一个对象的私有数据成员只能在类定义的范围内使用,也就是说只能通过它的公有成员函数来访问。对象的这种数据封装和数据隐藏使对象和外界以一堵不透明的墙隔开,这给软件设计者增加了负担,它要求设计者确保为每个类提供足够的方法,以应对所遇到的种种情况。数据隐藏给两个类共享同一函数或数据带来了额外开销,这是因为每次访问这些共享内容都需要通过函数调用来完成。4.1友元的概念和定义在某些情况下,把成员级别的访问控制赋于非本类成员的普通函数或者另一个类的成员函数时,会更方便一些。使用friend关键字,友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个普通函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。C++中的友元为“封装”这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视类内部的秘密。友元分为友元函数、友元成员和友元类三种。十4.1友元的概念和定义在某些情况下,把成员级别的访问控制赋于非本类感员的普通函数或者另一个类的成员函数时,会更方便一些。使用friend关键字,友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个普通函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。C++中的友元为“封装”这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视类内部的秘密。友元分为友元函数、友元成员和友元类三种。十4.1友元的概念和定义注意:友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率。但矛盾的是,即使是最大限度的保护,避免把类成员全部设置成public,同样也破坏了类的封装特性,这即是友元的缺点,在现在CPU速度越来越快的今天我们并不推荐使用它,但它作为C++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。十4.2友元函数在类中声明一个普通函数,在前面加上friend修饰,那么这个普通函数就成了该类的友元函数,可以访问该类的一切成员。{structpoint{intx,y;}center;intradius;public:classCircleublegetArea();doublegetDistance();friendvoiddisplay(Circle);//声明普通函数display为类Circle的友元函数■■■■do};关于友元函数的说明:友元函数的说明方法:friend返回值类型函数名(参数表);友元函数的特点:1.一个类的友元函数不是类的成员函数,它是独立于类的一般的外部函数,可以访问这个类的所有私有和保护成员。2.从技术上讲,可以在类定义中的任何一个位置声明友元函数。因为该声明涉及到非成员函数,因此访问限定符(private,public,protected)是不起作用的。但是,一般情况下很多人习惯上在类中首先给出友元函数的声明。3.友元函数可定义在类内(内联)或类外。在类外定义时,格式与普通函数相同,不需要加friend关键字和类名::关于友元函数的说明:4.友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,没有this指针,所以它不能直接引用对象成员的名称,它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。对象名.成员名对象指针-成员名voiddisplay(Circlec1)circle_main.cpp{coutthecenterofthecircleis:c1.centerx,≤c1.center.y;couttheradiusis:c1.radiusendl;}关于友元函数的说明:5.成员函数和友元函数具有同等的特权(100%的),主要的区别在于调用形式不同。友元函数的调用形式与普通函数相同,象f(x)这样调用,而成员函数象x.f()这样调用。(注意:友元函数不能用成员选择符(.或-)调用)。因此,允许设计者选择他所认为更具可读性的语法来降低维护成本。6.友元函数在类中说明,但其名字的作用域在类外,作用域的开始点在说明点,结束点和类名相同。因此,友元说明可以代替该函数的函数说明。如果在说明友元时给出了该函数的函数体代码,则它是内联的。7.一个函数可以成为多个类的友元函数,因而可以访问多个类的成员。关于友元函数的说明:5.成员函数和友元函数具有同等的特权(100%的),主要的区别在于调用形式不同。友元函数的调用形式与普通函数相同,象f