什麼是對象 ?
區分是不是對象,看有沒有實際地址。
eg:引用綁定對象,無實際地址,不是對象;指針存放對象的地址,有實際地址,是對象。
一般說法
引用/指針的值
說的是指向了什麼對象, 引用/指針所指向對象的值
說的是對象的值。
引用
- 引用只是對象的別名,引用≠對象;
- 引用只能
綁定對象
,不能綁定字面值,但是可以賦值字面值
; - 引用只能綁定一個對象,永遠指向初始化的對象,因此
必須初始化
; - 引用的聲明寫法是:
&引用
引用賦值規則:
- 引用賦值給引用,不改變引用的指向,但改變所綁定的對象的值;
- 引用賦值給變量,將引用所指向對象的內容賦給變量;
- 變量賦值給引用,第一次賦值是對引用指向的初始化,非第一次賦值是改變引用所指向對象的值;
- 變量賦值給變量,沒什麼好說的。
int i = 0, &r1 = i; double d = 0, &r2 = d;
/*
(a) r2 = 3.14159; 正確,字面值3.14159可以賦給引用(r2)綁定的double類型變量d
(b) r2 = r1; 正確,引用賦值規則1
(c) i = r2; 正確,引用賦值規則2
(d) r1 = d; 正確,引用賦值規則3
*/
指針
- 指針是一個對象,因此存在指向指針的指針;
- 無須初始化(不初始化容易出錯);
- 指針存放某個對象的地址,要用
取地址符&
進行賦值,不是直接綁定對象; - 在生命週期內,
可以指向不同的對象
; - 指針的類型和對象的
類型必須嚴格匹配
; *指針
有兩個含義:① 聲明指針 ,② * 爲解引用符
,訪問指針所指向的對象。
指針賦值規則
對指針進行賦值只能使用以下四種類型的值:(1)空指針;(2)類型匹配的對象的地址;(3)當前指向對象的下一地址;(4)同類型的另一個有效指針。
3種生成空指針的方法:
儘量使用nullptr
3種指針的值相等的條件
- 空指針
- 指向同一個對象
- 指向同一個對象的下一個地址
特殊指針類型 void*
- 無數據類型,任何類型的指針(包括void*)都可以直接賦值給void*而無需強制類型轉換;
- 不能直接訪問void*所指向的對象,必須先轉換爲確定的類型。