4.2.3 指針/引用參數(shù)
在介紹指針/引用參數(shù)之前,先來介紹函數(shù)的傳遞方式。在C++中,函數(shù)參數(shù)主要采用兩種傳遞方式:值傳遞和引用傳遞。所謂值傳遞是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣,在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù);而引用傳遞是指在調(diào)用函數(shù)時將實際參數(shù)的地址傳遞到函數(shù)中,那么,在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。
下面編寫一個按值傳遞的函數(shù)OutputNumber,函數(shù)的作用是輸出一個數(shù)值。

例4.2 按值傳遞。(實例位置:光盤TMInstances4例4.2)
- voidOutputNumber(intnNumber)
- {
- cout<<nNumber<<endl;//輸出數(shù)值
- nNumber=20;//修改參數(shù)
- }
在main函數(shù)中調(diào)用OutputNumber函數(shù)。
- intmain(intargc,char*argv[])
- {
- intnNum=10;//定義一個變量
- OutputNumber(nNum);//調(diào)用OutputNumber函數(shù)
- cout<<nNum<<endl;//輸出變量值
- return0;
- }
運行程序,效果如圖4.4所示。
從圖4.4中可以發(fā)現(xiàn),在OutputNumber函數(shù)中輸出的 數(shù)值是10,盡管在該函數(shù)中將參數(shù)nNumber設(shè)置為20,但是在main函數(shù)中執(zhí)行"cout<< nNum<<endl;"語句時,輸出的結(jié)果仍為10。因為OutputNumber函數(shù)采用按值傳遞,對形式參數(shù)nNumber的修改不會影響到實際參數(shù)nNum。
如果修改OutputNumber函數(shù),將參數(shù)的類型修改為引用類型,則OutputNumber函數(shù)將按引用方式傳遞。
| 圖4.4 值傳遞 |
例4.3 按引用傳遞。(實例位置:光盤TMInstances4例4.3)
- voidOutputNumber(int&nNumber)//設(shè)置引用類型參數(shù)
- {
- cout<<nNumber<<endl;//輸出結(jié)果
- nNumber=20;//修改參數(shù)值,將影響到實際參數(shù)
- }
- intmain(intargc,char*argv[])
- {
- intnNum=10;//定義一個變量
- OutputNumber(nNum);//調(diào)用OutputNumber函數(shù)
- cout<<nNum<<endl;//輸出變量值
- return0;
- }
運行程序,效果如圖4.5所示。
| 圖4.5 引用傳遞 |
從圖4.5中可以發(fā)現(xiàn),在OutputNumber函數(shù)中將形式參數(shù)nNumber設(shè)置為20,實際參數(shù)nNum的值也為20。因為引用傳遞,傳遞的是參數(shù)的地址,對nNumber的修改自然會影響到nNum。
許多讀者可能會問,如何判斷函數(shù)是值傳遞還是引用傳遞呢?這需要根據(jù)參數(shù)的數(shù)據(jù)類型來判斷,如果參數(shù)的數(shù)據(jù)類型是指針類型、引用類型或數(shù)組類型,則函數(shù)是引用傳遞,其他情況下是值傳遞。因此,不僅只有引用數(shù)據(jù)類型才是按引用傳遞,指針和數(shù)組類型參數(shù)同樣是按引用傳遞。下面修改函數(shù)OutputNumber,采用指針作為函數(shù)參數(shù)。
例4.4指針作為函數(shù)參數(shù)。(實例位置:光盤TMInstances4例4.4)
- voidOutputNumber(int*pNumber)//使用指針作為函數(shù)參數(shù)
- {
- cout<<*pNumber<<endl;//輸出參數(shù)值
- *pNumber=20;//設(shè)置參數(shù)值
- }
- intmain(intargc,char*argv[])
- {
- intnNum=10;//定義一個整型變量
- OutputNumber(&nNum);//調(diào)用OutputNumber函數(shù)
- cout<<nNum<<endl;//輸出nNum
- return0;
- }
運行程序,效果與圖4.5是相同的。
在編寫函數(shù)時,如果函數(shù)需要采用引用方式傳遞,使用指針和引用作為參數(shù)類型都是可以的。使用指針和引用類型作為函數(shù)參數(shù)各有優(yōu)缺點,視具體環(huán)境而定。對于引用類型,引用必須被初始化為一個對象,并且不能使它再指向其他對象,因為對引用賦值實際上是對目標對象賦值。這是引用類型的缺點,但也是引用類型的優(yōu)點,因為在函數(shù)調(diào)用時需要驗證引用參數(shù)的合法性。例如,如果函數(shù)OutputNumber采用引用參數(shù)類型,則語句"OutputNumber(0);"是非法的。如果函數(shù)OutputNumber采用指針類型參數(shù),則語句"OutputNumber(0);"是合法的。因為0被認為是一個空指針,對空指針操作必然會導(dǎo)致地址訪問錯誤。因此對于指針對象作為函數(shù)參數(shù),函數(shù)體中需要驗證指針參數(shù)是否為空。這是使用指針類型作為函數(shù)參數(shù)的缺點。但是,使用指針對象作為函數(shù)參數(shù),用戶可以隨意修改指針參數(shù)指向的對象,這是引用類型參數(shù)所不能的。
愛華網(wǎng)


