私は本を手に入れました。
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
どういう意味ですか?
関数宣言の後にキーワードconst
で示される "const関数"は、このクラス関数がクラスのメンバ変数を変更することをコンパイラエラーにします。ただし、クラス変数の読み取りは関数内では問題ありませんが、この関数内の書き込みはコンパイラエラーを引き起こします。
そのような "const関数"について考えるもう一つの方法は、暗黙のthis
ポインタを取る通常の関数としてクラス関数を見ることです。そのため、メソッドint Foo::Bar(int random_arg)
(末尾にconstを付けずに)は、int Foo_Bar(Foo* this, int random_arg)
のような関数になり、Foo f; f.Bar(4)
のような呼び出しは、内部的にFoo f; Foo_Bar(&f, 4)
のようなものに対応します。最後にconstを追加すると(int Foo::Bar(int random_arg) const
)、const thisポインタを使った宣言として理解できます:int Foo_Bar(const Foo* this, int random_arg)
。このような場合のthis
の型はconstなので、メンバ変数の変更はできません。
関数がクラスのどの変数にも書き込めないという「const関数」の制限を緩和することは可能です。関数が「const関数」としてマークされている場合でも、一部の変数を書き込み可能にするために、これらのクラス変数はキーワードmutable
でマークされています。したがって、クラス変数が変更可能としてマークされていて、「const関数」がこの変数に書き込むと、コードは正しくコンパイルされ、変数は変更される可能性があります。 (C++ 11)
const
キーワードを扱うときにいつものように、C++ステートメントでconstキーWordの位置を変更することは全く異なる意味を持ちます。上記のconst
の使用法は、括弧の後の関数宣言の最後にconst
を追加する場合にのみ適用されます。
const
は、C++で非常に多用されている修飾子です。構文と順序付けは、ポインタとの組み合わせでは単純明快ではないことがよくあります。 const
の正しさとconst
キーワードに関するいくつかの読み:
2つのクラス型変数を考えます。
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
これでb0
上のBoo
の any メンバー関数を呼び出すことができますが、b1
上のconst
-qualifiedメンバー関数のみです。
Bar
は、呼び出されているオブジェクトを変更しないことが保証されています。たとえば、C++ FAQの 定数の正確性に関するセクション を参照してください。
概念的には、あなたがthisポインタをconstにしていると考えるのがずっと簡単であると思う(これはそれがすることのほとんどです)。
関数はあなたが与えたポインタ/参照を介してそのパラメータを変更することはできません。
考える必要があるたびにこのページに行きます。
http://www.parashift.com/c++-faq-lite/const-correctness.html
Meyersの "もっと効果的なC++"にも良い章があると思います。