對(duì)象更有用的玻璃罩_第1頁
對(duì)象更有用的玻璃罩_第2頁
對(duì)象更有用的玻璃罩_第3頁
對(duì)象更有用的玻璃罩_第4頁
對(duì)象更有用的玻璃罩_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、對(duì)象更有用的玻璃罩原創(chuàng)案例講解”玻璃罩 const ”系列的三篇文章: 1. 使用常對(duì)象為共用數(shù)據(jù)加裝一個(gè)名為 const 的玻璃罩 2. 常( const )+ 對(duì)象 + 指針:玻璃罩到底保護(hù)哪一個(gè) 3. 對(duì) 象更有用的玻璃罩常引用本文講在基于對(duì)象的程序設(shè)計(jì)中,函數(shù)中傳遞參數(shù)使用 更廣泛的技術(shù),利用引用及常引用的話題。 先從引用的 作用開始談起。一、引用用在參數(shù)傳遞中的優(yōu)勢(shì):帶回修改值及節(jié)省開 支 先從一個(gè)經(jīng)典的例子開始。 假如現(xiàn)在要交換兩個(gè) 整數(shù),編寫出的程序如下: cpp view plaincopyprint?/ 程序 1 #include <iostream> using

2、 namespace std; void swap(int x, int y); / 用整形本身做形參 int main() int a=5,b=3; swap(a,b);/ 函數(shù)調(diào)用時(shí)傳值cout<<a=<<a<< , b=<<b<<endl; / 輸出 a=5,b=3 ,根本不能完成交換值 system(pause); return 0; void swap(int x,int y) int t; t=x; x=y; y=t; 這個(gè)程序無法完成任務(wù)。 因?yàn)樵诘?9 行調(diào)用 swap() 函數(shù)時(shí), 將實(shí)參 a,b 的值傳遞給了 實(shí)參

3、x,y,函數(shù)swap()在執(zhí)行時(shí),確實(shí)也交換了 x和y。但 是,任務(wù)最終交換 a 和 b 的要求卻不能完成,前述的交換已 經(jīng)與 a,b 無關(guān)。 在傳統(tǒng) C 語言中,可以利用指針實(shí)現(xiàn)在 函數(shù)中改變實(shí)參所對(duì)應(yīng)存儲(chǔ)單元的值。 cpp view plaincopyprint?/ 程序 2 #include <iostream>using namespace std; void swap(int *x, int *y); int main() int a=5,b=3; swap(&a,&b); /將 a 和 b 的地址值傳遞給形式參數(shù) x 和 y cout<<a=

4、<<a<< , b=<<b<<endl; / 將輸出 a=3, b=5 ,交換成功 system(pause);return 0; void swap(int *x,int *y) /x 指向 a, y 指向 b int t;t=*x;*x=*y;II對(duì)*x 的修改,即是對(duì)實(shí)參a的修改*y=t;II對(duì)*y的修改,即是對(duì)實(shí)參b 的修改 在將實(shí)際參數(shù) a 和 b 的地址值傳遞給形式 參數(shù) x 和 y 后, swap() 函數(shù)中所做出的針對(duì) x 和 y 所指向的 單元的修改,改的就是 a和b的值。函數(shù)調(diào)用完后,盡管 x 和 y 的生命周期結(jié)束,但“交換

5、”的結(jié)果卻留在了 main() 函數(shù) 中。 在 C+ 中,引入了引用類型專門處理此類問題。 cpp view plaincopyprint?II 程序 3 #include <iostream>using namespace std;void swap(int &x, int&y); int main() int a=5,b=3;swap(a,b); IIa 即是 x, b 即是 y cout<<a=<<a<< , b=<<b<<endl;II將輸出 a=3, b=5 ,交換成功system(pause);

6、return 0; void swap(int &x,int &y) /x即是 a ,y 即是 b int t; t=x; x=y;/ 對(duì) x 的修改,即是對(duì)實(shí)參 a 的修改 y=t; /對(duì) y 的修改, 即是對(duì)實(shí) 參b的修改 在第9行調(diào)用函數(shù)swap()時(shí),按函數(shù) 傳值的特點(diǎn)和引用類型的含義,x與a共用存儲(chǔ)單元,y與b 共用存儲(chǔ)單元, 所以在執(zhí)行函數(shù) swap 時(shí),對(duì) x 和 y 的修改, 就是對(duì)a和b的修改。函數(shù)調(diào)用完后,x和y的生命周期結(jié) 束了,但 a 和 b 顯然保存的是交換后的值。略做一個(gè)總結(jié),可以發(fā)現(xiàn)程序 3中的諸多優(yōu)勢(shì)。程序 3與程序 2 相比,都能實(shí)現(xiàn)在函數(shù)中修

7、改實(shí)參對(duì)應(yīng)的值,但在實(shí)現(xiàn)中,不 用意識(shí)到地址的存在,并且從調(diào)用的角度, swap(a,b) 比 swap(&a,&b) 直觀、簡單的多,這會(huì)有效減少程序 中在調(diào)用時(shí)可能犯的錯(cuò)誤。程序 2 中需要兩個(gè)存儲(chǔ)地址值的 單元x和y,而程序3中的x和y直接用的就是a和b的單 元,從空間角度,節(jié)省了可能我們并不在意的一點(diǎn)點(diǎn)空間。 程序 3 與程序 1 相比,兩者在調(diào)用的形式上完全一樣,函數(shù) 體的寫法完全一樣,僅是函數(shù)原型中有些許差別。但是,程 序 3 之偉大之一在于,可以在函數(shù)中對(duì)實(shí)參的值進(jìn)行修改, 而程序 1 卻不行。另外一個(gè)顯著區(qū)別在于,程序 1 在調(diào)用 sway() 時(shí),要為形參分配

8、存儲(chǔ)單元,然后將實(shí)參的值寫入, 而程序 3 中 x 和 y 直接用的就是 a 和 b 的單元, 不用分配空 間,也不用花時(shí)間賦值。從本例中,程序 1 的空間多占用 8個(gè)字節(jié)( x 和 y 分別 4 字節(jié)),賦值要多占用一點(diǎn)點(diǎn)時(shí)間,這 點(diǎn)空間和時(shí)間微不足道。但是,如果形參和實(shí)參是對(duì)象,并 且數(shù)據(jù)成員比較多,尤其是某些成員是數(shù)組等占用空間很大 時(shí),引用的機(jī)制帶來的在開支上的節(jié)約就不是可以輕言忽略 了。 綜上,鑒于可以實(shí)現(xiàn)修改的功能,以及在空間、時(shí) 間上的巨大優(yōu)勢(shì),可以提高程序的執(zhí)行效率。當(dāng)函數(shù)參數(shù)中 需要涉及對(duì)象 (類 )時(shí),我們用引用類型。引用,專為對(duì)象而生!二、類對(duì)象的引用做形式參數(shù) 看一個(gè)例

9、子: cpp view plaincopyprint?/ 程序 4 #include <iostream> using namespace std;class Test private:int x; int y; public:Test(int a, intb)x=a;y=b;void printxy() const;voidsetX(int n) x=n; void setY(int n) y=n; ; void Test:printxy() const cout<<x*y=<<x*y<<endl; void doSomething(Test

10、&p1) / 形參是引用類型 p1.setX(5); p1.printxy( ); void main(void) Test t1(3,5); doSomething(t1); / 實(shí)參是對(duì)象, t1 和 p1 是同義詞, p1 占 用的就是 t1 的地址t1.printxy();system(pause); 可以知道,程序執(zhí)行的結(jié)果是輸出了兩次: x*y=25 。第一次的輸出表明,在調(diào)用 doSomething() 函數(shù)中, t1 的 x 數(shù)據(jù)成員被修改;而第 2 次 的輸出則說明,這個(gè)修改確實(shí)影響了實(shí)參 t1 ,盡管隨著程序 調(diào)用結(jié)束,這種引用關(guān)系已經(jīng)解除。 這是一件令人感到 快意

11、的事。 但,問題由此而生。 如果在需求中, doSomething() 函數(shù)確定為不允許修改t1,這種機(jī)制不正好成了bug的溫床,當(dāng)程序員無意中錯(cuò)誤地寫入了諸如第 22 行對(duì)數(shù)據(jù)成員修改 的語句,這種錯(cuò)誤將被編譯器包庇下來。假如項(xiàng)目灰常大, 那是令人抓狂的后果。 為了限制這種無意的修改,我們 想到了玻璃罩 const 。三、用對(duì)象的常引用做形參所謂對(duì)象的常引用,就是將引用用 const 進(jìn)行限定。 自然,引用不能被修改。 將 對(duì)象說明為常引用形式是:const 類型名 &對(duì)象名 ; 下面是用對(duì)象的常引用做形參的例子。 cpp view plaincopyprint?/ 程序 5 #in

12、clude <iostream> using namespace std; class Test private: int x;int y; public:Test(int a, intb)x=a;y=b;void printxy() const;voidsetX(int n) x=n;void setY(int n) y=n; ;/形參是常引用void Test:printxy() const cout<<x*y=<<x*y<<endl; void doSomething(const Test &p1)“Test:setX不能: 將“

13、this 指針從“ const Test 轉(zhuǎn)換為“ Test& p1.printxy( );void main(void)Test t1(3,5);doSomething(t1); / 實(shí)參是對(duì)象system(pause);第 22 行在編譯p1.setX(5); /將招致錯(cuò)誤error C2662:時(shí)會(huì)出現(xiàn)錯(cuò)誤,這說明用常引用做形參可以避免函數(shù)中對(duì)對(duì) 象的修改。無論實(shí)際參數(shù)是否為常對(duì)象,這種限制都是存在 的。四、小結(jié) 在對(duì)象做函數(shù)的形式參數(shù)時(shí),用對(duì)象的引 用做形式參數(shù)是一個(gè)直觀且高效的處理方法,提倡用好。 當(dāng)不允許在函數(shù)體內(nèi)對(duì)參數(shù)的值作出修改時(shí),常將形式參數(shù) 指定為const,這也是

14、需要用好的 C+的特性。五、玻璃罩系列總結(jié) 我將 const 比喻為一個(gè)玻璃罩, 由const決定的“常XX的目標(biāo)就是防止出現(xiàn)不該發(fā)生的對(duì)變 量/對(duì)象的改變,“只許看不許摸”式的限制,成了一個(gè)有效的 機(jī)制。 下面將限制由嚴(yán)格到更靈活做個(gè)排列,也作為對(duì) 系列文章的總結(jié)。方法示例含義詳解鏈接使用常對(duì)象 Test const t1; 或 const Testt1;對(duì)象在初始化之后,在任何情況下都不能被修改。這是最嚴(yán)格的限制。(整體任何時(shí)候、任何場(chǎng)合都不能改)名為 const 的玻璃罩 類中定義常數(shù)據(jù)成員 class Testconst int x;Test 類的任一對(duì)象,其數(shù)據(jù)成員 x 均不能被修改

15、;訪問 x 的成員函數(shù)也必 須為常成員函數(shù)。(對(duì)象中的某一特定部分在任何時(shí)候、任何場(chǎng)合都不能改) 名為 const 的玻璃罩類中定義常成員函數(shù) class Test int x;void f() const;f 函數(shù)中,對(duì)本類的數(shù)據(jù)成員, 可以訪問,但不可以修改 (在 本函數(shù)之外, 隨便;但進(jìn)了本函數(shù)所管轄范圍, 誰都不要改, 無論是在其他場(chǎng)合可改變的非 const 對(duì)象,還是在其他場(chǎng)合 也不能改變的 const 對(duì)象。 f 的地盤 f 做主。)名為 const 的玻璃罩函數(shù)參數(shù)中使用指向常對(duì)象的指針作形式參數(shù) void f(const Test *p1, Test *p2) 通過 *p1 訪問實(shí)參的對(duì)象,無論對(duì)象是否加了 const 限定,都不可以 被修改。 而在同一個(gè)函數(shù)中, p2 所指向的對(duì)象卻是可以被修 改的。(在 f 的地盤上,根據(jù)聲明區(qū)別對(duì)待,不該改的別該,該改 的任你改。民主社會(huì)的追求。 )用指針避免了函數(shù)調(diào)用中“大”對(duì)象的復(fù)制, 可以提高效

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論