




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
友元友元根据数据封装的要求:类中定义的数据成员不能在外界直接访问,必须要通过类中定义的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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 管理学市场调查预测
- 静脉血栓病例讨论
- 智慧方案大型火电厂技术监督管理创新探索
- 2025年镉、铋相关常用有色金属项目立项申请报告
- 2025年钛酸锆陶瓷材料项目申请报告
- 2025年昆明市公安局官渡分局勤务辅警招聘考试笔试试题(含答案)
- 2025年河北公安厅交通管理总队高速交警招聘考试笔试试题(含答案)
- 2025年福建泉州市晋江市佳豪置业发展有限公司招聘编外考试笔试试题(含答案)
- 【晋城】2025年山西晋城市城区事业单位公开招聘工作人员241人笔试历年典型考题及考点剖析附带答案详解
- 【衡水】2025年河北衡水市委党校选聘事业单位工作人员2人笔试历年典型考题及考点剖析附带答案详解
- 七年级历史下学期核心知识点、难点、重点知识总结
- 《基于web的宠物商城管理系统设计与实现》8800字(论文)
- 磷酸锰铁锂正极材料的研究现状
- 直销团队队伍建设与管理
- 加气站气瓶充装质量保证体系手册2024版
- 8.1公平正义的价值 教案 -2024-2025学年统编版道德与法治八年级下册
- 2025新人教版七下英语单词默写表
- 旅行社脱团免责协议
- 云南省大理白族自治州2023-2024学年高一下学期7月期末考试 政治 含解析
- 电网专题研究报告2025-泽平宏观
- 2024年08月浙江广发银行杭州分行招考笔试历年参考题库附带答案详解
评论
0/150
提交评论