在通過const
聲明工作時,您向後看。不幸的是,它有一個例外:由於歷史原因允許使用const int
,但它意味着與int const
相同。
下面,const
「回顧」到int
因此p
指向一個不能更改的int。
int const * p;
而在這裏,在const
「回顧」的int *
所以p
不允許指向任何東西,但它指向什麼,現在可以通過p
改變。
int i = 5; int j = 5;
int * const p = &i;
*p = 6; // ok, you can still modify `i` through `p`
p = &j; // error because you can't change what `p` points at
而這裏,p
是const int指針。 p
不允許更改,它指向的內容不能更改。
int i = 5; int j = 5
int const * const p = &i;
*p = 6; // error, promised not to makes changes through `p`
p = &j; // error `p` is stuck to `i`
當將一件事分配給另一件事時,規則是承諾不能被破壞。 int const
是承諾int
永遠不會改變。如果你試試這個:
int const i = 5;
int * p = &i; // error
和編譯器讓你做到這一點,那麼您需要能夠打破i
絕不會做改變的諾言這個
*p = 6;
現在i
將被改變從5到6,打破了i
永不改變的承諾。
沒關係,因爲你沒有違反任何承諾。在這種情況下,你只能保證不會修改i
當你通過指針p
int i = 5;
int const * p = &i;
*p = 6; // error, because we promised not to change `i` through `p`
i = 6; // ok, because `i` itself is not const
const
訪問它是重要的,因爲內置的安全檢查。如果您聲明爲const
的內容發生更改,編譯器會給您一個錯誤。您可以將類的方法聲明爲const
,這是承諾該類中的數據不會被該方法更改。很容易忘記並稍後修改該方法來更改類中的某些內容,但編譯器會提醒您。
這對優化也很重要。如果編譯器知道某事是const
它可以做出很多簡化的假設來加速代碼。
我不明白你的問題..你有什麼困惑? – immibis
您的問題的標題似乎與問題的內容無關。我沒有看到任何關於複製對象的問題。 –
我沒有得到處理引用的最後兩條語句。規則即忽略頂級常量在這裏似乎不起作用。 –