直接上圖,網頁的表格換行麻煩,寫出來格式也太醜了吧,還是看圖比較清楚。
表格裏的代碼我都在VS2017裏調試運行過。
1、頂層const
(自己本身是常量)
引用 | 指針 |
---|---|
實際上沒有常量引用這種東西,因爲引用不是一個對象,我們沒法讓引用本身恆定不變。 | 常量指針:指針本身爲常量。 int a = 0; int *const p1 = &a; |
引用沒有頂層const | 1) 指針本身爲常量,初始化後,則指針的值(也就是存放在指針中的那個地址)就不能再被改變了。 2) 指針本身是一個常量並不意味着不能通過指針修改其所指對象的值,能否這樣做依賴於所指對象的類型。 例子: int a = 0; int *const p1 = &a; // 所指對象是非常量*p1=2; // 可以這樣修改所指對象*p1的值` |
2、底層const
(所指對象是常量)
引用 | 指針 |
---|---|
對const的引用:把引用綁定到const對象上。對常量的引用不能被用作修改它所綁定的對象。 “對const的引用”簡稱爲“常量引用”,不過你得時刻記得這就是個簡稱而已。 |
指向常量的指針:指針指向const對象。 |
1) 正常情況:將const int &綁定到const對象上。 例子: const int a = 1; const int &r1 = a; 2) 例外情況:引用的類型必須與引用的對象類型一致,但有兩個例外:一種例外情況就是允許將const int &綁定到一個普通int對象上。 此時不能通過引用去修改被綁定對象的值,但可以通過別的方式修改對象的值。 例子: int a=0; const int &r1 = a; a =1; // 可以修改a的值,因爲a是非常量3) 允許將const int &和字面值或某個表達式的計算結果綁定到一起。 const int &r2 = 2; const int &r3 = a*3; |
1) 正常情況:讓const int *指向常量對象。 例子 const int a = 1; const int *p = &a; p =nullptr; // 指針本身不是const型,可以修改2) 例外情況:指針的類型必須與所指對象的類型一致,但有兩個例外:一種例外情況就是允許令一個指向常量的指針指向一個非常量的對象(就問你這句話繞不繞)。此時不能通過該指針改變對象的值,但沒有規定那個對象的值不能通過其他途徑改變。 例子: int a = 0; const int *p = &a; a = 1; // 可以修改a的值,因爲a是非常量 |
總結:誰是const誰就不能被修改。
指針是const,指針就不能被修改(此時如果指針所指對象不是const,則對象是可以被修改的)。指針所指對象是const,所指對象就不能被修改(此時如果指針不是const,則指針是可以被修改的。)
用於聲明引用的const都是底層const,因爲引用不是一個對象,引用本身不會是const的。