程序設(shè)計教程:用C++語言編程 第4版 課件 3-2 友元_第1頁
程序設(shè)計教程:用C++語言編程 第4版 課件 3-2 友元_第2頁
程序設(shè)計教程:用C++語言編程 第4版 課件 3-2 友元_第3頁
程序設(shè)計教程:用C++語言編程 第4版 課件 3-2 友元_第4頁
程序設(shè)計教程:用C++語言編程 第4版 課件 3-2 友元_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論