2012-08-23 60 views
5

我看過const之前在static數組聲明中使用了兩次,現在我創建了自己的靜態數組我想知道爲什麼在某些情況下需要兩次const。在靜態數組聲明中使用了兩次C++ const

是否有指針數組有影響?

a. static const TYPE name[5]; 
b. static const TYPE const name[5]; 

c. static const TYPE* name[5]; 
d. static const TYPE* const name[5]; 

我的理解是,b.是無效的,但如果使用const時兩次是有效的,什麼是它的目的是什麼?

回答

12

const TYPE * x;

表示x指向的東西是const。

TYPE * const x;

表示指針x是常量。

結合2得到:

const TYPE * const x;

含義指針和指向的東西都是const。

+0

感謝您的快速回復。我會標記這個正確的明天。 – Jim

0

在第一個代碼塊中,第二行中有一個冗餘副本const,這沒有任何影響。 (事實上​​,好的編譯器會提醒你這個問題。)你正在聲明一個5 const TYPE的數組,就是這樣。

第二個代碼塊具有兩個不同的方案:第一行,使五個可變指針const TYPE秒的陣列,而後者使得五個恆定指針的數組,以const TYPE秒。

請注意,您必須初始化一個常量數組:由於您以後不能更改這些值,因此將它們定義爲未初始化沒有任何意義。

+0

實際上,只要你喜歡,你可以拋出儘可能多的'const'類型。他們是冪等的。 – bitmask

+0

@bitmask:噢,確定。你會從合理的編譯器得到一個編譯器警告,但:-)謝謝! –

+0

Ooops,我可能在這裏混合了C和C++。我的錯。 – bitmask

1

您可以將任何cv限定符(constvolatile)應用於任何類型,包括cv限定類型 - 但不在同一個聲明中。然而,他們比任何運營商更強烈地結合,以優先的形式,並且可以在限定類型的兩側應用:

// Let T by any type: 
T const tr; 
const T tl; 
const T const tlr; // only in C 
const const const const const T t5; // only in C 
typedef const T CT; 
CT const tcc; // fine, although CT was already const 

聲明如出一轍,恆T。如果T已經有cv限定符,這不會改變附加限定的含義。

現在,優先;你可以說「我想要一個指向常量T」:

const T (* tp); 

它通常被寫成

const T* tp; 

因爲const結合比*反正強。在相同的模式,你可以定義一個變量,它是「恆定的,而是在一個可變T點」:即通常寫爲

T* const tp = 0; 

本着同樣的精神下標操作[]

T (* const tp) = 0; // must be initialised, because tp is immutable 

應用 - 與表達式中的優先級相同。

0

在類型上使用const兩次在C++ 2003中是非法的,但在C++ 2011中是合法的(參見7.1.6.1 [decl.type.cv]第1段:「忽略冗餘cv資格)」。當你使用

static const TYPE const name[5]; 

你讓TYPE不斷兩次。但請注意,此聲明在C++ 2011中也是非法的,因爲在聲明它時需要初始化一個const對象。的

const TYPE 

TYPE const 

意思是絕對等同的:在這兩種情況下,你讓TYPE對象不變。爲了保持一致性,我總是把const放在正確的位置,因爲除頂級類型const之外的每一個都必須放在右側(當然,除非某些編碼指南的要求不同,但我正在與愚蠢的編碼準則打交道)。

當使用指針時,認爲會變得不同。有兩種類型:類型指向類型和指針。它們中的每一個可以另行製作const

TYPE const*  ptr1(0); // non-const pointer to const TYPE 
TYPE* const  ptr2(0); // const pointer to non-const TYPE 
TYPE const* const ptr3(0); // const pointer to const TYPE 

最好的方式來弄清楚什麼是由const是閱讀由右至左的類型聲明。當然,這是假定const限定符被放置在正確的位置。在上面的討論中,您可以用volatileconst volatile代替const,並且適用相同的推理。