很多人一定都有這樣的疑惑,包括我之前也不是很清楚,經過學習一段時間QT之后,想把自己的總結和心得和大家分享一下。
先明確一下什么是指針,什么是引用。
指針:
指針是編程語言中的一個對象,利用地址,它的值直接指向存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。使用*定義指針。
引用:
引用引入了對象的一個同義詞。定義引用的表示方法與定義指針相似,只是用&代替了*。引用是c++對c語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣
指針和引用的區別:
1.指針是一個實體,而引用僅是個別名;
2.引用必須被初始化,指針不必;
3.引用只能在定義時被初始化一次,之后不可變;指針可以改變所指的對象;
4.可以有const指針,但是沒有const引用;
5.不存在指向空值的引用,但是存在指向空值的指針,即引用不能為空,指針可以為空;
6.“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
7.指針和引用的自增(++)運算意義不一樣; 指針自增指向下一個地址,而引用是對變量本身的值的增加。
8.程序為指針變量分配內存區域,而引用不需要分配內存區域;
9.指針可以有多級,但是引用只能是一級,例如int **p是合法的,而 int &&a是不合法的;
10.指針和引用作為函數參數進行傳遞時也不同。用指針傳遞參數,可以實現對實參進行改變的目的;在將引用作為函數參數進行傳遞時,實質上傳遞的是實參本身,而不是實參的一個拷貝,因此對形參的修改其實是對實參的修改。
總而言之指針與引用的一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以后不能改變。
指針和引用的相同點:
兩者都是地址的概念,指針指向一塊兒內存,其內容為所指內存的地址;引用是某塊兒內存的別名。
區分用指針和引用的不同情況:
使用引用的情況:
1.常引用,用這種方式聲明的引用,不能通過引用對目標變量的值進行修改,從而使引用的目標成為const,達到了引用的安全性,函數體不能對引用型參數修改目標變量。聲明方式:const 類型標識符 &引用名 = 目標變量名
2.作為函數的返回值,當類A的數據成員包含B類的對象,可以在類A中定義一個方法,返回B類的對象的引用,返回的是引用就不會有副本產生,可以直接修改類對應類B的對象。
函數定義時要按以下格式:
類型標識符 &函數名 (形參列表及類型說明)
{ 函數體 }
引用作為返回值,必須遵守以下規則:
1.不能返回局部變量的引用,主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態。
2.不能返回函數內部new分配的內存的引用。雖然不存在局部變量的被動銷毀問題,可對於這種情況(返回函數內部new分配內存的引用),又面臨其它局面。例如,被函數返回的引用只是作為一個臨時變量出現,而沒有被賦予一個實際的變量,那么這個引用所指向的空間(由new分配)就無法釋放,造成內存泄漏。
使用指針和引用的情況對比:
1.是考慮到存在不指向任何對象的可能(在這種情況下,能夠設置指針為空)
2.需要能夠在不同的時刻指向不同的對象(在這種情況下,能改變指針的指向)。如果總是指向一個對象並且一旦指向一個對象后就不會改變指向,那么就應該使用引用。
3.重載某個操作符時,應該使用引用。當你知道你必須指向一個對象並且不想改變其指向時,或者在重載操作符並為防止不必要的語義誤解時,你不應該使用指針。而在除此之外的其他情況下,則應使用指針。
