友元函数讲解课件.pptVIP

  • 10
  • 0
  • 约1.75千字
  • 约 11页
  • 2018-06-19 发布于贵州
  • 举报
友元函数讲解课件

友 元 引子 因为C++的封装性和数据隐藏性,只有类自身的函数才可以不受限制的访问类的非公有成员;任何非成员函数直接访问类中非公有数据成员都会导致编译错误. 例外情况:需要非成员函数去访问类的私有数据成员. ♂解决办法:1,把私有属性(private)变为公有(public)-----但这样做违背了数据封装性和数据隐藏性; 2,可把对应的非成员函数定义为该类的友元函数来解决. 友元函数 概念:友元函数就是可以直接访问类的成员(包括私有数据成员)的非成员函数.它是一个外部函数. 一个外部函数只能通过类的授权而成为友元函数. 友元函数 类如何授权一个函数作为友元函数? 答:通过在类的定义中声明函数,并且在该函数的声明前加上关键字friend,这样类和该函数之间创建了友元关系.关键字friend不能够在类的定义之外使用. 注:类的访问限定符(public,private和protected)对友元函数是不起作用的. 内容对应教材:9.10节 1 友 元 函 数 1 友 元 函 数 [用例]P152 例,补充完整,编译运行. 1 友 元 函 数 1 友 元 函 数 //file.h #ifndef FILE_H #define FILE_H class Point //点类 { Public: Point(int,int); int x,y; }; class Line //线类 { public: Line(int,int,int); friend double dis(Line,point); //计算距离 private: int a,b,c; }; #endif 1 友 元 函 数 //func.cpp #includecmath Point::Point(int x1,int y1): X(x1),y(y1) { } Line::Line(int a1,int b1,int c1) :a(a1),b(b1),c(c1) { } double dis(Line m,Point n) { double d; d=abs(m.a*n.x+m.b*n.y+m.c)/(sqrt(m.a*m.a +m.b*m.b)); return d;} int main() { Point p(10,10); Line t(2,4,-3); cout“点到线的距离:”dis(t,p)endl; } // 12.7456 2友 元 类 2 友 元 类 [用例] #includeiostream class A { int n; public: A() {n=5;} friend class B; }; class B { public: void display( A t) { cout “n=“t.nendl;} }; int main() { A a; B b; b.display(a); } * * 北京科海电子出版社 · 声明友元函数的方式是在类声明中用关键词friend声明该函数,其格式 如下: friend 函数类型 友元函数名(参数表); 北京科海电子出版社 · 【用例】编写一个程序,以友元函数方式计算一个点到一条直线的距 离。 解:设计一个点类Point,它有两个公有数据成员x和y,表示点的坐标 (因为要在类外使用,所以设计为公有的)。另一个类为直线类Line, 它有3个私有数据成员a、b和c,表示直线方程ax+by+c=0,该类中设 计一个友元函数dist计算一个点到直线的距离。点(x,y)到直线 (ax+by+c=0)的距离d的计算公式如下: 北京科海电子出版社 · 北京科海电子出版社 · C++中允许声明一个类为另一个类的友元类(friend class)。例如, 以下语句声明类B是类A的友元类: class A { ... public: friend class B; ... };

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档