關於傳參方式,之前在c語言裡面已經接觸過了兩種:傳值呼叫和傳址呼叫兩種。而作為c語言的加強版,c++中自然也是將這兩種方式,繼承了下來,並且在c++裡面也有了新的一種傳參方式----引用。
首先,從概念上講,所謂的引用,就是給乙個已經存在的變數,起了乙個新的別名。其實它用的還是和被引用的物件是同一塊記憶體空間,並沒有重新開闢出一段新的記憶體空間。注:既然使用的是同一塊空間,引用當然要注意引用型別必須和引用實體是同一種型別。
引用的語法規則是這樣的:型別& 引用變數名(物件名) = 引用實體;
void testref()
1. 引用在定義時必須初始化
2. 乙個變數可以有多個引用
3. 引用一旦引用乙個實體,再不能引用其他實體
void testref()
以上面**為例,首先說引用要進行初始化,這很好理解,既然引用是在給乙個實體
起到別名,當然需要指定這個別名是給誰起的,否則就沒有意義了,這也就是為什麼函式種第二條會被報錯了。
說到第二點,也好理解,既然是別名。那麼使用多個名字,對這個空間不會造成影響,當然就是被允許的。
關於第三點,引用一旦引用乙個實體,再不能引用其他實體,從int & rra = a;這句來看,編寫者是想表達rra從引用a變成引用b,但是編譯器有可能認為是給它重新賦值,這就會造成歧義了。
在引用的前面加上const來修飾的方法,我們管他叫常引用。基於const修飾的變數通常都具有不可修改的特點,那麼常引用,也就是對引用實體不能進行修改的一種引用方法。
引用一般來說,有兩個使用場景,乙個是作為引數,乙個是作為函式返回值。
比如,用引用寫乙個swap函式:
void swap(int& left, int& right)
對比傳值和傳址兩種方法來說,必須承認,引用天生更適合這個交換函式的使用。不像傳值,那樣在函式中交換的只是實參的臨時拷貝副本,在函式呼叫完畢就銷毀了,並沒有對實參有實質的改變。也不想傳址那樣,交換的是兩個變數的位址,還要在進行解引用,才能得到交換後的結果。
引用不同,既然直接傳的就是這兩個空間本身,因此既不用建立臨時拷貝,也不需要交換變數位址。而是直接對兩個變數進行交換。
2.引用做返回值
int& testrefreturn(int& a)
注意:如果函式返回時,離開函式作用域後,其棧上空間已經還給系統,因此不能用棧上的空間作為引
用型別返回。如果以引用型別返回,返回值的生命週期必須不受函式的限制(即比函式生命週期長)。
關於引用和指標的區別,要從語法層與底層兩個角度去看。
從語法層,兩者的概念上就是不同的,引用是對原空間起的乙個別名,因此還是與引用實體相同的那個空間。
而指標,是對變數的位址的儲存,將變數儲存的位址通過取位址取出,再存入新的變數中,這個新的變數就叫指標變數。兩者使用的不再是同乙個空間/
從底層來看,引用與指標又是同樣的實現方式,引用實際上就是通過指標來實現的。
引用和指標的不同點:
1. 引用在定義時必須初始化,指標沒有要求
2. 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別
實體3. 沒有null引用,但有null指標
4. 在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數(32位平台下佔
4個位元組)
5. 引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小
6. 有多級指標,但是沒有多級引用
7. 訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
8. 引用比指標使用起來相對更安全
學到的新方法!
random.next maxvalue 返回乙個小於所指定最大值的非負隨機數 1.datetime.now.tostring yyyymmdd 設定當前時間格式 2.string newstr string.format 當前日期為 datatime.now 讓使用者輸入乙個值得時候 double...
python 函式傳參 傳參和傳引用
首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...
c 拷貝建構函式引用傳參
看一道c 面試題 給出下述 分析編譯執行的結果,並提供3個選項 a.編譯錯誤 b.編譯成功,執行時程式崩潰 c.編譯執行正常,輸出10 class a private int value public a int n a a other void print int main a a 10 a b ...