




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
友元友元根據(jù)數(shù)據(jù)封裝的要求:類中定義的數(shù)據(jù)成員不能在外界直接訪問,必須要通過類中定義的public成員函數(shù)來訪問。在有些情況下,這種對數(shù)據(jù)的訪問方式效率不高!為了提高在類的外部對類的非public成員的訪問效率,在C++中,可以指定某些與一個類密切相關(guān)的、又不適合作為該類成員的程序?qū)嶓w能直接訪問該類的非public成員,這些程序?qū)嶓w稱為該類的友元。友元是數(shù)據(jù)保護和數(shù)據(jù)訪問效率之間的一種折衷方案。友元需要在類中用friend顯式指出,它們可以是全局函數(shù)其它類的所有成員函數(shù)其它類的某個成員函數(shù)例如:classA{ ......
friendvoidfunc();//全局函數(shù)func可訪問x
friendclassB;//類B的所有成員函數(shù)可訪問x
friendvoidC::f();//類C的成員函數(shù)f可訪問xprivate:intx;};
關(guān)于友元的幾點說明友元不是一個類的成員。友元關(guān)系具有不對稱性。例如:假設(shè)B是A的友元,如果沒有顯式指出A是B的友元,則A不是B的友元。友元也不具有傳遞性。例如:假設(shè)C是B的友元、B是A的友元,如果沒有顯式指出C是A的友元,則C不是A的友元。例:實現(xiàn)矩陣與向量相乘操作矩陣類的定義classMatrix//矩陣類{ int*p_data;//表示矩陣數(shù)據(jù)
introw,col;//表示矩陣的行數(shù)和列數(shù)
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<<"矩陣下標(biāo)越界\n"; exit(-1); } return*(p_data+i*col+j); }intelement(inti,intj)const//重載的特殊情況!//訪問矩陣元素(為常量對象而提供)。
{ if(i<0||i>=row||j<0||j>=col) { cerr<<"矩陣下標(biāo)越界\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//獲得矩陣的行數(shù)。
{ returnrow; } intdimension_column()const//獲得矩陣的列數(shù)。
{ returncol; }
voidinput_data()//輸入矩陣數(shù)據(jù) { 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<<"向量下標(biāo)越界!\n"; exit(-1); } returnp_data[i]; } intelement(inti)const//訪問向量元素(為常量對象而提供)。
{ if(i<0||i>=num) { cerr<<"向量下標(biāo)越界!\n"; exit(-1); } returnp_data[i]; } intdimension()const//返回向量的尺寸。
{ returnnum; }
voidinput_data()//輸入向量數(shù)據(jù)
{ 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; }};矩陣與向量對象的創(chuàng)建 introw,column;//矩陣的行數(shù)、列數(shù) cin>>row>>column; Matrixm(row,column);//創(chuàng)建矩陣對象m m.input_data();//輸入矩陣m的數(shù)據(jù) m.display();//顯示矩陣m的數(shù)據(jù)
intdim;//向量元素個數(shù)
cin>>dim;
Vectorv(dim);//創(chuàng)建向量對象v v.input_data();//輸入向量v的數(shù)據(jù)
v.display();//顯示向量v的數(shù)據(jù)編寫一個函數(shù)multiply,實現(xiàn)矩陣與向量相乘的操作:
voidmultiply(constMatrix&m,
constVector&v,
Vector&r); 參數(shù)m:用于相乘的矩陣參數(shù)v:用于相乘的向量參數(shù)r:相乘的結(jié)果向量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); }}由于頻繁地通過調(diào)用成員函數(shù)element來訪問矩陣和向量的元素,每一次調(diào)用中都要檢查下標(biāo)的合法性,因此效率不高!multiply的實現(xiàn)1(非友元)multiply的實現(xiàn)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的私有數(shù)據(jù)成員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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)手工藝的職業(yè)成長設(shè)計計劃
- 道德故事在課堂教學(xué)中的應(yīng)用計劃
- 推動智慧辦公提升工作效率計劃
- 中職電子商務(wù)企業(yè)管理實踐的案例分享試題及答案
- 獸醫(yī)技術(shù)評估與分析試題及答案
- 動物心理行為管理試題及答案
- 基金從業(yè)資格理念剖析試題及答案
- 世界各國教育改革狀況
- 2024年預(yù)算員證書考試綜合分析題試題及答案
- 電商創(chuàng)新模式與技術(shù)試題及答案
- 二十案例示輪回
- 老年營養(yǎng)示范化病房創(chuàng)建方案
- 設(shè)備安全操作培訓(xùn)
- 西方文化概論(第二版)課件全套 曹順慶 第0-6章 緒論 西方文化的淵源與流變、西方文學(xué) -西方社會生活與習(xí)俗
- 某地區(qū)現(xiàn)代有軌電車施工方案
- GB/T 6974.3-2024起重機術(shù)語第3部分:塔式起重機
- DB11T 2103.1-2023 社會單位和重點場所消防安全管理規(guī)范 第1部分:通則
- 物業(yè)品質(zhì)巡查管理制度
- 高中物理-《互感與自感》課件-新人教版選修3
- 養(yǎng)殖林麝合作協(xié)議書模板
- 鋼鐵項目環(huán)評報告 - 2工程分析
評論
0/150
提交評論