2011-10-27 34 views
38

「頂級」限定符中的const在C++中是什麼意思?頂級const限定符是什麼?

什麼是其他的水平?

例如:

int const *i; 
int *const i; 
int const *const i; 
+3

的例子嗎? – bmargulies

+0

我不知道你的意思是什麼,但我添加了一些我熟悉的const修飾符。 – user103214

+3

另請參見[C++ 11標準中'頂級cv-qualifiers'的定義在哪裏?](http://stackoverflow.com/q/24676824/1708801) –

回答

49

頂層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,而不管其他任何代碼)。

+3

非常明確,謝謝:) – Seb

+6

另一點:在寫函數時,參數的頂級限定符將被丟棄。這意味着'void foo(char const)'和'void foo(char)'是相同的函數(實際上它們可以互換)。理由是由於參數是通過拷貝來進行的,因此調用者並不關心拷貝是否可以修改,所以對她來說是透明的。 –

+7

@MatthieuM。好點,雖然說不完全正確。聲明中以及函數的類型中忽略了頂級限定符。然而,在定義中,它們在函數中仍然照常運行。 (頂級限定符在type匹配和模板參數時也會被忽略,當匹配要捕獲的異常時,可能在某些其他情況下我忘記了。實際上,它們對非類型返回值也沒有影響。) –

10

int *const iconst置於頂層,而int const *i不。

第一個表示指針i本身是不可變的,而第二個表示指針指向的內存是不可變的。

只要const出現在緊挨着標識符類型的前面或後面,即被視爲頂級限定符。

+0

優秀和明確的答案。附: 'int const * i'等於'const int * i'(全都是低級const)。我使用'const int * i'(低級別)從'int * const i'(頂級)更頻繁地區分它的const級別。 – dotslash

5

它被向我解釋的方式,給出:

[const] TYPE * [const] VARIABLE 

VARIABLE用於通過*VARIABLE

指向數據類型TYPE通過*或畫一條線多個* s

  1. 如果有const離開它適用於 數據數據不能改變的**VARIABLE不能分配,除了在初始化
  2. 如果有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 
+0

'const'綁定到左邊。除非左邊沒有什麼東西,那麼它就是正確的 – sp2danny