2017-02-11 24 views
2

私はconstを使って追加保護を追加する方法に関するルールを探しています。例えばconstを追加する適切な方法は何ですか?

:それはポインタ変換にCONST、正しさのルールになると

int** p1 = ...; 
int** const p2=p1; // Legal 
int* const * const p3=p1; // Legal 
int* const * const p4=p3; // Legal 
const int* const * const p5=p3; // Error 

int*** cube1= &p1; 
int* const ** cube2=cube1; // Error 
and so on... 
+0

「追加保護を追加する方法のルール」は、どの保護を達成しようとしているかによって異なります。保護する必要があるものと保護されないものを知っているのはあなただけです。 – AnT

答えて

2

、C言語では、非配列データ型Tためconst T *を入力するタイプT *からの暗黙的な変換をサポートします。これは、C言語がサポートする唯一の "const-protect"暗黙の変換です。 TU同じ非配列型である場合すなわち

は、T *からconst U *への変換がサポートされています。 TUと何らかの形で異なる場合、暗黙の変換は無効です(TUの違いがほんの追加のconst修飾子であっても)。

簡単に言えば、constは、最も内側の後にのみ追加することができます*。あなたは間接指定のより深いレベルでconstを追加することはできません。これは、p5cubeの行がコンパイルに失敗する理由です。

int *p = 0; 
const int *cp = p; // OK: `const` is added after the first `*` 

int **pp = 0; 
const int *const *cpp = pp; // Error: a "deep" `const` added 

時々、あなたのコードでは、これらの制限を回避し、間接のより深いレベルでいくつかの余分なconstを追加する必要があります。その場合、明示的なキャストを使用する以外に選択肢はありません。

int **pp = 0; 
const int *const *cpp = (const int *const *) pp; 

P.S. C++はこれらの制限のいくつかを緩和し、const正当性ルールのより論理的なシステムを作成しました。悲しいかなCは決してその方向で何の措置もとらなかった。

+0

こんにちは、お返事ありがとう!質問 - なぜ、 'int * const ** cube2 = cube1'が、最も内側の' * 'の後にconstを追加しても機能しないのはなぜですか? –

+0

@StavAlfi:「最も内側の」*で「最も近い」*を意味します。この場合、内部から2番目の '*'の後に 'const'を追加しました。それは最も内なるものではありません。 – AnT

+0

「最もふさわしい」* ''とは何ですか? –

2

constは、通常、その左側に定義された値に適用されます。

例:上記のコードで

int const *ptr = &val; 

constintなく*ptrに属します。

あなたはconst後ろ*を移動した場合、それはptr定数ポインタ

int *const ptr = &val; 

constint

今すぐ

const int *ptr = &val; 

場合にのみ、別の例を見ポインタとしないように属しようになりますの左端にはconstがありますステートメントは、上記のコードスニペットの右側にあるものに適用されます。これはintです。

+0

情報をありがとうが、私はそれが私の質問に答える方法を見ていない。ソリ私の質問が十分にはっきりしていない場合。私はconstを置くべき正しい場所を見つける方法についていくつかのガイドラインを探しています。 –

関連する問題