2010-06-10 66 views
0

可能重複:
what is the difference between const int*, const int * const, int const *consts和其他動物


我有我有麻煩讀一段cpp的代碼至極。 B類現在定義爲
,我理解前兩行,但其餘的不夠清楚。
是行「B const * pa2 = pa1」定義了類型爲B的常量變量?
如果是這樣,下一行做什麼?

B a2(2); 
B *pa1 = new B(a2); 
B const * pa2 = pa1; 
B const * const pa3 = pa2; 

還,我無法搞清楚這兩者之間的區別:

char const *cst = 「abc」; 
const int ci = 15; 


謝謝

+0

http://stackoverflow.com/questions/269882/c-const-question – tanascius 2010-06-10 13:34:56

+0

,我建議你刷上使用指針。 http://www.cplusplus.com/doc/tutorial/pointers/ – 2010-06-10 13:36:48

+1

並選擇一些答案。 – 2010-06-10 13:37:06

回答

1

此代碼聲明一個指針指向一個恆定B - 換句話說,它不能被用來改變它所指向的值:

B const * pa2 = pa1; 

可替換地,下面的代碼聲明一個不斷poi NTER以恆定B - 所以,pa3不能用來改變它所指向的值,它不能被修改爲指向別的東西:

B const * const pa3 = pa2; 

This page包含const指針的解釋。

爲了解決第二個問題,

char const *cst = 「abc」; - 聲明指向一個恆定的字符 - 在這種情況下,字符串「abc」。

const int ci = 15; - 聲明一個不能更改的常量整數15

0

第二個代碼片段展示了一種方法來改變順序類型和常量沒有任何不同:順序是不相關的。

在第一個代碼片段中,第三個變量的「const」表示您不能更改指向使用該指針的對象。在相同的代碼片段中,最後一個變量的另一個常量表示您不能將指針重新設置爲指向另一個對象。就此而言,它是一個不變的變量指針,不允許更改指向的對象。

要使用第一個代碼段的變量來說明第二個代碼段的問題 - 您可以在第一個代碼段中更改第三個和下一個變量的類型順序和「const」,而不做任何不同的事情:

const B * pa2 = pa1; // Same 
const B * const pa3 = pa2; // Same 
3

C++ FAQ lite摘自:

你必須讀指針聲明從右到左。

  • 佛瑞德常量* P指 「p指向的常數佛瑞德」:Fred對象不能通過p來修改。
  • Fred * const p表示「p是指向Fred的常量指針」:您不能更改指針p,但可以通過p更改Fred對象。
  • Fred const * const p表示「p是一個常量Fred的常量指針」:你不能改變指針p本身,也不能通過p來改變Fred對象。
0

C語言中的基本規則++是const適用「不變性」(你不能改變它)到該對象的的一部分。例外是宣言線的最前面。如果const在那裏,它反而適用於右側的對象部分。

因此,行:

B const * pa2 = pa1; 

手段「PA2是指向類型B的恆定對象,具有(指針)PA1分配作爲其初始指針值」。

線:

B const * const pa3 = pa2; 

手段「PA3是一個常量指向類型B.它指向我們初始化PA2以指向同一個對象的恆定對象」。

許多人(如果不是大多數的話)喜歡在可行時將const放在行的前面,因爲他們喜歡它讀取的方式。其他人(包括我自己和你的代碼作者)不喜歡處理句法異常,而更喜歡將它放在其對象的右側。

非常重要的,關於這個主題更多的信息看這個問題:In C++ is "const" after type ID acceptable?