2017-05-29 4 views
3

まあ私はconstがポインタとして混乱する可能性があることを認識しませんでした。誰かが、次のコードがconstの点で正確に何をしているのかを段階的に説明できますか?C++で "Const"以外のことは、コンパイラにその特定のものが読み込み専用であることを伝えています

const int*const Method3(const int*const&)const; 

初心者でないプログラマでも混乱します。

+0

タイトル質問に答えるために、コンパイラが最適化されている場合があります。あなたが「const」を書かなくて済む最大の利点は、他の誰かがあなたのコードを読んで読んだときです。 OPについては、私は以下の書面による回答にそれを残します。 – AlexG

+0

'const int * const'は大変です、私の意見では。いくつかのconstを使うつもりなら、 'int const * const'ははるかに明確な構文のようです。 –

+0

この質問は頻繁に尋ねられます。より詳しい回答をご覧ください:https://stackoverflow.com/questions/3888470/c-const-member-function-that-returns-a-const-pointer-but-what-type-of-const –

答えて

5

constの2つのスタイルが混在しているため、混乱する可能性があります。

const int*const Method3(const int*const&)const; 

これを理解する最善の方法は、私の意見では、逆に読むことです。我々が得る後方にそれを読むことで

const int*const -> int const* const 

const intからconstポインタを

は、戻り値の型で始まるのをしてみましょう。

同様に、関数のパラメータのために:

const int* const& -> int const* const& 

を読み取ることによって、後方我々が得る:参照をconstポインタにconst intに。

また、この関数はconstとマークされています。つまり、そのクラスへの参照が定数の場合に呼び出されるメンバ関数です。

+1

も参照(恥知らずのプラグ)https://stackoverflow.com/questions/38925121/are-there-any-downsides-to-marking-all -variables-you-dont-modify-const/38925200#38925200 –

+0

@JesperJuhlが追加されました。 – user2296177

+0

@ user2296177なぜ私たちは参照とポインタを関数の引数に持つのですか?私は参照で渡すか、ポインタまたは値で渡しますが、参照ポインタで渡すのですか? –

2

休憩それを下:

const int*const Method3(const int*const&)const; 
^  ^   ^  ^ ^ 
    |   |    |   |  | 
    |   |    |   |  |-> you can use it in objects declared as constants 
    |   |    |   | 
    |   |    |   | -> you get a const pointer to const int(the paramater can no be changed in any form) 
    |   |    
    |   | -> you get a const pointer to const int(the returned value can no be changed in any form)    
可能 const最適化と更なる理解のために

は、これらの答えを参照してください

+0

あなたのASCIIアートには、第1および第3の 'const'を指す行の説明がありません。 –

+0

@ JesperJuhl第1と第2の 'const'は、第3と第4のものと同じ記述を使用します。しかし、アートはそれについてはっきりしていませんが、矢印は1&3から始まり、2&4から始めるのではなく、2&4になるはずです。 –

3

constは、何かが読み取り専用であるか、読み取り専用データ(またはその両方)を指していることをコンパイラーに通知します。それはその主な仕事であり、意図していないものを誤って変更した場合、コンパイラがコンパイルエラーを警告するのに役立ちます。

また、メンバ関数const(オブジェクトを変更しない場合)をマークすると、それらをより多くのコンテキストで使用することができます。

オプティマイザはまた、あなたが本当にそのconstものを変更しないを証明できる場合に限っそれはあなたのコードに最適化を支援するためにconstの存在を使用することができます。しかし、「エイリアシング」、つまりvolatilemutableおよびconst_cast(Cスタイルのキャストを含む)が言語に存在するため、ほとんどの場合、そのようにすることができるという制約があります。

+2

今日のオプティマイザは、変数が実際に変更されていないかそれが 'const'とマークされているかどうかにかかわらず、私は最近、constの有無にかかわらず、いくつかのコードの逆アセンブリを比較し、全く同じ最適化を見ました。変数はメモリから読み込む代わりにリテラルに変換されました。 – zett42

+1

@ zett42確かに、彼らはかなり賢いですが、場合によっては 'const'によってさらに助けられるかもしれません。たとえば、https://docs.google.com/document/d/112O-Q_XrbrU1I4P-oiLCN9u86Qg_BYBdcDsmh7Pn9Nwを参照してください。 –

関連する問題