2010-12-08 15 views
1

Javaでは、文字列を '定数'を宣言するためにfinalと指定できます。たとえば、C++最終定数文字列

static final String myConst = "Hello"; 

これをC++で行う正しい方法はありますか?

const char * myConst = "Hello"; 

しかし、実際には、あなたはどのようなそのポインタポイントに変更することができます。

const char * const myConst = "Hello"; 

私はいつも見てきた人々がこれを行います。それで、なぜ人々はポインタを一定として宣言しないのですか?それを行う正しい方法は何ですか?

+1

いいえポインタのポインタを変更することはできません。あなたはポインタを変更することができます。 –

+1

FYI、C++ではそれを逆に読むべきです。 'const char * myConst'が読み込まれます:" myConstは定数の文字へのポインタです "。 'const char * const myConst'は" myConstは定数の文字への定数ポインタです "と読み込まれます。 –

+0

ほとんどの場合、最後のオプションが表示されます。宣言を書いた人はそれほど良く分かりませんでした。 – aschepler

答えて

12
const std::string myConst("Hello"); 
+2

JavaのStringオブジェクトとより正確に平行する場合は+1。 –

+0

静的部分を忘れないでください。Javaをミラーリングするには、静的メンバー変数である必要があります(ただし、グローバルであるとは限りません)。なぜなら、質問によって明らかにされていないアクセス制限があるからです。 –

+1

@Martin:静的メンバーの場合は、宣言でも初期化できませんでした。 –

5

はい、const char* constは、変更しないCスタイルの文字列を宣言する正しい方法です。

またはそれ以上:

#include <string> 
const std::string myConst = "Hello"; 
0

私は正確にあなたの質問を理解していません。ポインタが、その後変更される可能性があり場合

const char * myConst = "Hello"; 

:多かれ少なかれfinal Javaキーワードを模倣するために、それは

const char * const myConst = "Hello"; 

(ポインタを変更するつもりされていない場合)、および/またはいずれかになります。最後に、最初のバージョンでは定数であるため、実際にポインタ自体を変更することはできません。

0

ディエゴの編集では、そう、それを書く正しい方法です。人々は通常、変数constを宣言しません。なぜなら、変更するかどうかを気にせず、変更されないことを信頼しているからです(を知っているので変更しません)。

文字列リテラルには実際にconst文字が含まれているため、pointed-to constを宣言しているため、実際にはconst char *を持つ変数に代入する必要があります。

0

技術的には、

char * const myConst = "Hello"; 

は、ポインタを再割り当てすることは、おそらく回復することができなかった文字列を残すだろうとして、最も正解です。

一部の実装では、あなたが(それは悪いアイデアだ場合でも)「こんにちは」の文字を変更することができ、とても

char const * const myConst = "Hello"; 

の最初のconstは素晴らしいアイデアです。個人的に

char const * myConst = ...; 

と などのconstのchar * myCount = ...;

は同等です。私はconstが常に変更する項目の後に続くスタイルガイドラインを適用する傾向があります。長期的には誤解を減らすことがあります。

つまり、ほとんどの人はconstをC++で正しく使用する方法を知らないため、使用されていないか、まったく使用されていません。これは、改良されたCコンパイラとしてC++を使用するためです。

+1

char * const myConst = "Hello"; これは定数C文字列を定義しません。これは、C++がCとの互換性を許すハックです。あなたは非定数文字列へのポインタに文字列リテラルを割り当てています。もちろん、すべてのコンパイラは、突然変異操作を許可しなければならない。 myConst [2] = 'a';これも未定義の動作です。 –

+0

@Gene Bushuyev:なぜあなたは 'myConst [2] = 'a';は未定義の振る舞いですか? '' a''は、数値型のchar(単にASCII環境で 'myConst [2] = 97;と書く別の方法)の値を設定するための略語です。配列内で97を設定するのがなぜ未定義の動作になるのでしょうか? – kriss

1
const char * myConst = "Hello"; 

これは、指し示すオブジェクトが変更できないことを意味します。

char * const myConst = "Hello"; 

これは、ポインタが指し示す位置は変更できませんが、オブジェクトの値は変更できないことを意味します。

const char * const myConst = "Hello"; 

これはどちらも変更できないことを意味します。私の経験では誰もこれを覚えていませんが、ネット上では常に利用可能です!

典型的には、3人は私が筆記する時に答えます!

+0

2つ目は、コンパイラエラーが発生します... – kriss

+0

@kriss私はC. –

+0

@krissとの後方互換性のために 'のchar *'への文字列リテラルから暗黙の変換があったC++で考えた:もう一つは発生しますあなたのコンパイラが合理的であるならばコンパイラの警告ですが、あなたのコンパイラが準拠していればエラーを引き起こすことはできません。 –

0

実際には、ポインタが指しているものを に変更することができます。ですから、なぜ 人はポインタを と同じように宣言していませんか?正しい方法は何ですか。

これは有用ではないため、スタック上の値(ポインタを含む)を非constにしたいと思うことがよくあります。 Get Sutter & Alexandrescu "コーディングスタンダード"本で、この点について説明しています。

0

実際のポイントは、文字列を二重引用符で囲んで格納するには少なくともconst char *というポインタを宣言しなければならないという点です。何も強制的に(コンパイラの警告もエラーもなく)ポインタを一定にします...人が怠けているので、あなた自身の結論を引き出すことができます。おそらく実際に定数を定義しようとしていなくても、コンパイラのエラーを止めたいだけです(この場合は警告)。

心の中で、私はおそらく、とにかく別のソリューションのために行くだろうと維持:

const char myConst[] = "Hello"; 

ここでの違いは、この方法は、私はポインタに文字列として使用された元のバイト配列を減衰しないことで、私は元のリテラルとして正確に使用できるバイト配列を保持します。

私はsizeof(myConst)のようなことをすることができ、sizeof("Hello")と同じ結果が得られます。文字列をポインタに変更すると、sizeofは文字列のサイズではなくポインタのサイズを返します。

...明らかにこのようにするとポインタを変更することは無意味になりますもうポインタが変わる。

関連する問題