私の理解では、const
修飾子は右から左に読む必要があります。それから、私はそれを得る:
const char*
char要素を変更できないポインターですが、ポインター自体は変更できます。
char const*
mutable
charsへの定数ポインターです。
しかし、次のコードでは次のエラーが発生します。
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
だから...どれですか?私の理解またはコンパイラ(VS 2005)は間違っていますか?
実際、標準に従って、const
は要素を直接その左に変更します。宣言の先頭でのconst
の使用は、便利な精神的なショートカットにすぎません。したがって、次の2つのステートメントは同等です。
char const * pointerToConstantContent1;
const char * pointerToConstantContent2;
ポインター自体が変更されないようにするには、const
をアスタリスクの後に配置する必要があります。
char * const constantPointerToMutableContent;
ポインターとポインターが指すコンテンツの両方を保護するには、2つのconstを使用します。
char const * const constantPointerToConstantContent;
私は個人的にalwaysを採用しました。変更しない部分の後にconstを置いて、ポインタが一定に保ちたい部分であっても一貫性を維持します。
両方が同じであるため機能します。混乱するかもしれませんが、
const char* // both are same
char const*
そして
char* const // unmutable pointer to "char"
そして
const char* const // unmutable pointer to "const char"
[これを覚えておくために、ここに簡単なルールがあります。'*'は最初にLHS全体に影響します]
これは、ルールが次のとおりであるためです。
ルール:const
は左にバインドします。左に何もなければ、右にバインドします:)
だから、これらを見てください:
(const --->> char)*
(char <<--- const)*
両方同じ!ああ、そして--->>
および<<---
は演算子ではなく、const
のバインド先を示すだけです。
( 2つの単純な変数初期化の質問 )から
const
に関する非常に良い経験則:
右から左への宣言を読む
(Vandevoorde/Josutissの「C++テンプレート:完全ガイド」を参照)
例えば。:
int const x; // x is a constant int
const int x; // x is an int which is const
// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p; // p is a reference to const-int
int * const * p; // p is a pointer to const-pointer to int.
私はこの経験則に従って以来、このような宣言を誤解することはありませんでした。
(:sisab retcarahc-rep a no ton、sisab nekot-rep a no tfel-ot-thgir naem I hguohT:tidE
ここに私がいつも解釈しようとする方法があります:
char *p
|_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".
char * const p
|_____ again start from the asterisk. "content of constant (since we have the `const`
modifier in the front) `p` is a `char`".
char const *p
|_____ again start from the asterisk. "content of `p` is a constant `char`".
それが役に立てば幸い!
どちらの場合も、定数charを指しています。
const char * x //(1) a variable pointer to a constant char
char const * x //(2) a variable pointer to a constant char
char * const x //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?
デフォルトでは、const
は、すぐ左にあるものに適用されますが、(1)のように、前に何もない場合はすぐ右にあるものに適用できます。