web-dev-qa-db-ja.com

関数宣言の最後にある "const"とはどういう意味ですか?

可能な重複:
C++のメソッド宣言の最後に "const"の意味はありますか。

私は本を​​手に入れました。

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

どういう意味ですか?

461
aPoC

関数宣言の後にキーワード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キーワードに関するいくつかの読み:

定数の正確さ

C++の 'const'宣言:その理由と方法

783
Janick Bernet

2つのクラス型変数を考えます。

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

これでb0上のBoo any メンバー関数を呼び出すことができますが、b1上のconst-qualifiedメンバー関数のみです。

39

Barは、呼び出されているオブジェクトを変更しないことが保証されています。たとえば、C++ FAQの 定数の正確性に関するセクション を参照してください。

12
mkluwe

this に似ています。

本質的には、メソッドBarは、Foomutable 以外のメンバ変数を変更しないことを意味します。

8
JLWarlow

概念的には、あなたがthisポインタをconstにしていると考えるのがずっと簡単であると思う(これはそれがすることのほとんどです)。

7
Goz

関数はあなたが与えたポインタ/参照を介してそのパラメータを変更することはできません。

考える必要があるたびにこのページに行きます。

http://www.parashift.com/c++-faq-lite/const-correctness.html

Meyersの "もっと効果的なC++"にも良い章があると思います。

7
orbfish