程序设计教程:用C++语言编程 第4版 课件 3-2 友元_第1页
程序设计教程:用C++语言编程 第4版 课件 3-2 友元_第2页
程序设计教程:用C++语言编程 第4版 课件 3-2 友元_第3页
程序设计教程:用C++语言编程 第4版 课件 3-2 友元_第4页
程序设计教程:用C++语言编程 第4版 课件 3-2 友元_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

友元友元根据数据封装的要求:类中定义的数据成员不能在外界直接访问,必须要通过类中定义的public成员函数来访问。在有些情况下,这种对数据的访问方式效率不高!为了提高在类的外部对类的非public成员的访问效率,在C++中,可以指定某些与一个类密切相关的、又不适合作为该类成员的程序实体能直接访问该类的非public成员,这些程序实体称为该类的友元。友元是数据保护和数据访问效率之间的一种折衷方案。友元需要在类中用friend显式指出,它们可以是全局函数其它类的所有成员函数其它类的某个成员函数例如:classA{ ......

friendvoidfunc();//全局函数func可访问x

friendclassB;//类B的所有成员函数可访问x

friendvoidC::f();//类C的成员函数f可访问xprivate:intx;};

关于友元的几点说明友元不是一个类的成员。友元关系具有不对称性。例如:假设B是A的友元,如果没有显式指出A是B的友元,则A不是B的友元。友元也不具有传递性。例如:假设C是B的友元、B是A的友元,如果没有显式指出C是A的友元,则C不是A的友元。例:实现矩阵与向量相乘操作矩阵类的定义classMatrix//矩阵类{ int*p_data;//表示矩阵数据

introw,col;//表示矩阵的行数和列数

public: Matrix(intr,intc) { if(r<=0||c<=0) { cerr<<"矩阵尺寸不合法!\n"; exit(-1); } row=r; col=c; p_data=newint[row*col]; for(inti=0;i<row*col;i++)p_data[i]=0; } ~Matrix() {delete[]p_data;} int&element(inti,intj)//访问矩阵元素。

{ if(i<0||i>=row||j<0||j>=col) { cerr<<"矩阵下标越界\n"; exit(-1); } return*(p_data+i*col+j); }intelement(inti,intj)const//重载的特殊情况!//访问矩阵元素(为常量对象而提供)。

{ if(i<0||i>=row||j<0||j>=col) { cerr<<"矩阵下标越界\n"; exit(-1); } return*(p_data+i*col+j); }Matrixm(10,10);......m.element(1,2)=m.element(1,2)+1;voidf(constMatrix&m){intx;x=m.element(1,2)*10+1;} intdimension_row()const//获得矩阵的行数。

{ returnrow; } intdimension_column()const//获得矩阵的列数。

{ returncol; }

voidinput_data()//输入矩阵数据 { for(inti=0;i<row*col;i++) cin>>p_data[i]; } voiddisplay()const//显示矩阵元素。

{ int*p=p_data; for(inti=0;i<row;i++) { for(intj=0;j<col;j++) {cout<<*p<<''; p++; } cout<<endl; } }};向量类的定义classVector//向量类{ int*p_data; intnum; public: Vector(intn) { if(n<=0) { cerr<<"向量尺寸不合法!\n"; exit(-1); } num=n; p_data=newint[num];

for(inti=0;i<num;i++)p_data[i]=0; } ~Vector() { delete[]p_data; } int&element(inti)//访问向量元素。

{ if(i<0||i>=num) { cerr<<"向量下标越界!\n"; exit(-1); } returnp_data[i]; } intelement(inti)const//访问向量元素(为常量对象而提供)。

{ if(i<0||i>=num) { cerr<<"向量下标越界!\n"; exit(-1); } returnp_data[i]; } intdimension()const//返回向量的尺寸。

{ returnnum; }

voidinput_data()//输入向量数据

{ for(inti=0;i<num;i++)

cin>>p_data[i];

} voiddisplay()const//显示向量元素。

{ int*p=p_data; for(inti=0;i<num;i++,p++) cout<<*p<<''; cout<<endl; }};矩阵与向量对象的创建 introw,column;//矩阵的行数、列数 cin>>row>>column; Matrixm(row,column);//创建矩阵对象m m.input_data();//输入矩阵m的数据 m.display();//显示矩阵m的数据

intdim;//向量元素个数

cin>>dim;

Vectorv(dim);//创建向量对象v v.input_data();//输入向量v的数据

v.display();//显示向量v的数据编写一个函数multiply,实现矩阵与向量相乘的操作:

voidmultiply(constMatrix&m,

constVector&v,

Vector&r); 参数m:用于相乘的矩阵参数v:用于相乘的向量参数r:相乘的结果向量voidmultiply(constMatrix&m,constVector&v, Vector&r)//矩阵与向量相乘。{ if(m.dimension_column()!=v.dimension()|| m.dimension_row()!=r.dimension()) {cerr<<"矩阵和向量的尺寸不匹配!\n"; exit(-1); } introw=m.dimension_row(),col=m.dimension_column(); for(inti=0;i<row;i++) {r.element(i)=0; for(intj=0;j<col;j++)//计算r[i] r.element(i)+=m.element(i,j)*v.element(j); }}由于频繁地通过调用成员函数element来访问矩阵和向量的元素,每一次调用中都要检查下标的合法性,因此效率不高!multiply的实现1(非友元)multiply的实现2(友元)把multiply说明成Matrix和Vector的友元classVector;//Vector的声明(由于在定义它前需要用到它)classMatrix{ ......

friendvoidmultiply(constMatrix&m,constVector&v,

Vector&r);//这里提前用到Vector。};classVector{ ......

friendvoidmultiply(constMatrix&m,constVector&v,

Vector&r);};在multiply中直接访问Matrix和Vector的私有数据成员voidmultiply(constMatrix&m,constVector&v, Vector&r){ if(m.col!=v.num||m.row!=r.num) { cerr<<"矩阵和向量的尺寸不匹配!\n"; exit(-1);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论