本文轉(zhuǎn)自徐飛翔的“引用與指針的區(qū)別”
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
引用 (&)與指針(*)都可以在C++中用于表示一個對象的間接引用,其唯一差別似乎只有obj.member和pobj->member類似的用法上的區(qū)別。但其實這兩者在C++里面的具體用法和設(shè)計思想都不同的。我們知道在函數(shù)傳參數(shù)時,默認是值傳遞,意味著需要在傳參數(shù)時對傳入?yún)?shù)進行拷貝構(gòu)造,在返回時,如果也是值傳遞,那么同樣需要進行拷貝構(gòu)造。 作為一種更為高效的方法,是合適地進行引用傳遞,只是在函數(shù)傳參和返回時傳入和返回其對象的間接引用,使得這個過程更為高效,如:
int computeGradient(const Feature& input, Gradient* grad) {
//....
return SUCC; //狀態(tài)碼
}
在以上代碼中,傳入的引用input是一個常量,不應(yīng)該被程序改變,而*grad則是用于傳遞梯度的指針值,應(yīng)該對其進行處理,然后函數(shù)返回一個狀態(tài)碼表示運行狀態(tài)。在這個過程中,我們發(fā)現(xiàn),間接引用在實際應(yīng)用中有兩種類型,一種是僅僅是作為對象的引用,而不期望被程序改變;另一種是作為變量傳遞的。在C語言中,這兩種功能都用指針傳遞進行,頂多加上const表示其是常量,給予編譯器查錯的一絲絲尊嚴。然而在C++中,為了更好地區(qū)分這兩種功能,定義了一個『引用(&)』,引用專為第一個功能而生,因此對引用而言,必須對其進行初始化,而且初始化之后不能被改變,同時引用不能被初始化為空,因為這沒有意義。相比之下,指針靈活很多,初始化為nullptr不是什么問題,而且也隨時可能被改變。