「頂級」限定符中的const
在C++中是什麼意思?頂級const限定符是什麼?
什麼是其他的水平?
例如:
int const *i;
int *const i;
int const *const i;
「頂級」限定符中的const
在C++中是什麼意思?頂級const限定符是什麼?
什麼是其他的水平?
例如:
int const *i;
int *const i;
int const *const i;
頂層const限定符影響對象本身。其他人只有 與指針和引用相關。它們不會使對象 爲常量,並且僅阻止通過使用指針或參考的路徑進行修改。因此:
char x;
char const* p = &x;
這不是一個頂級的const,並且這些對象都不是不可變的。 表達式*p
不能用於修改x
,但其他表達式 可以; x
不是常量。對於這個問題
*const_cast<char*>(p) = 't'
是合法的和明確的。
但
char const x = 't';
char const* p = &x;
這個時候,對x
頂級常量,所以x
是不可改變的。不允許 表達式更改它(即使使用了const_cast
)。 編譯器可能會將x
置於只讀存儲器中,並且它可能會假定x
的值不會更改,無論其他代碼可以執行什麼操作。
爲了讓指針頂級const
,你會寫:
char x = 't';
char *const p = &x;
在這種情況下,p
將指向x
,直到永遠。任何改變這個 的嘗試都是未定義的行爲(並且編譯器可能會將p
置於只讀存儲器中, 或假設*p
指的是x
,而不管其他任何代碼)。
非常明確,謝謝:) – Seb
另一點:在寫函數時,參數的頂級限定符將被丟棄。這意味着'void foo(char const)'和'void foo(char)'是相同的函數(實際上它們可以互換)。理由是由於參數是通過拷貝來進行的,因此調用者並不關心拷貝是否可以修改,所以對她來說是透明的。 –
@MatthieuM。好點,雖然說不完全正確。聲明中以及函數的類型中忽略了頂級限定符。然而,在定義中,它們在函數中仍然照常運行。 (頂級限定符在type匹配和模板參數時也會被忽略,當匹配要捕獲的異常時,可能在某些其他情況下我忘記了。實際上,它們對非類型返回值也沒有影響。) –
int *const i
將const
置於頂層,而int const *i
不。
第一個表示指針i
本身是不可變的,而第二個表示指針指向的內存是不可變的。
只要const
出現在緊挨着標識符類型的前面或後面,即被視爲頂級限定符。
優秀和明確的答案。附: 'int const * i'等於'const int * i'(全都是低級const)。我使用'const int * i'(低級別)從'int * const i'(頂級)更頻繁地區分它的const級別。 – dotslash
它被向我解釋的方式,給出:
[const] TYPE * [const] VARIABLE
VARIABLE用於通過*VARIABLE
指向數據類型TYPE的通過*
或畫一條線多個*
s
const
到離開它適用於 數據和數據不能改變的*
的:*VARIABLE
不能分配,除了在初始化const
到右它適用於 變量和什麼不能改變的變量點的*
的:VARIABLE
不能分配,除了在initiali矩陣特殊積所以:
| left right
int * i1;
| no no can change *i1 and i1
int const * i2;
| yes no cannot change *i2 but can change i2
int * const i3;
| no yes can change *i3 but i3 cannot be changed
int const * const i4;
| yes yes cannot change *i4 or i4
'const'綁定到左邊。除非左邊沒有什麼東西,那麼它就是正確的 – sp2danny
的例子嗎? – bmargulies
我不知道你的意思是什麼,但我添加了一些我熟悉的const修飾符。 – user103214
另請參見[C++ 11標準中'頂級cv-qualifiers'的定義在哪裏?](http://stackoverflow.com/q/24676824/1708801) –