(1)
引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。
指標與引用看上去完全不同(指標用操作符’*’和’->’,引用使用操作符’.’),但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他對象。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?
首先,要認識到在任何情況下都不能用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變數並讓它指向一個對象,但是該變數在某些時候也可能不指向任何對象,這時你應該把變數聲明為指標,因為這樣你可以賦空值給該變數。相反,如果變數肯定指向一個對象,例如你的設計不允許變數為空白,這時你就可以把變數聲明為引用。
(2)不能有NULL 引用,引用必須與合法的儲存單元關聯(指標則可以是NULL)。
不存在指向空值的引用這個事實意味著使用引用的代碼效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的對象)
總的來說,在以下情況下你應該使用指標,一是你考慮到存在不指向任何對象的可能(在這種情況下,你能夠設定指標為空白),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指標的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼你應該使用引用。
還有一種情況,就是當你重載某個操作符時,你應該使用引用。最普通的例子是操作符[]。這個操作符典型的用法是返回一個目標對象,其能被賦值。
★ 相同點:
1. 都是地址的概念;
指標指向一塊記憶體,它的內容是所指記憶體的地址;引用是某塊記憶體的別名。
★ 區別:
1. 指標是一個實體,而引用僅是個別名;
2. 引用使用時無需解引用(*),指標需要解引用;
3. 引用只能在定義時被初始化一次,之後不可變;指標可變;
引用“從一而終” ^_^
4. 引用沒有 const,指標有 const,const 的指標不可變;
5. 引用不可為空,指標可以為空白;
6. “sizeof 引用”得到的是所指向的變數(對象)的大小,而“sizeof 指標”得到的是指標本身(所指向的變數或對象的地址)的大小;
typeid(T) == typeid(T&) 恒為真,sizeof(T) == sizeof(T&) 恒為真,
但是當引用作為成員時,其佔用空間與指標相同(沒找到標準的規定)。
7. 指標和引用的自增(++)運算意義不一樣;
1.從現象上看:指標在運行時可以改變其所指向的值,而引用一旦和某個對象綁定後就不再改變
2.從記憶體配置上看:程式為指標變數分配記憶體地區,而引用不分配記憶體地區
3.從編譯上看:程式在編譯時間分別將指標和引用添加到符號表上,符號表上記錄的是變數名及變數所對應地址。指標變數在符號表上對應的地址值為指標變數的地址值,而引用在符號表上對應的地址值為引用對象的地址值。符號表產生後就不會再改,因此指標可以改變指向的對象(指標變數中的值可以改),而引用對象不能改