関数宣言の最後にある「const」とはどういう意味ですか? [重複] 質問する

関数宣言の最後にある「const」とはどういう意味ですか? [重複] 質問する

私はある本を手に入れました。そこには次のようなことが書かれていました。

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

それはどういう意味ですか?

ベストアンサー1

関数宣言の後にキーワードで示される「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)の型はthisconst なので、データ メンバーを変更することはできません。

関数がクラスのどの変数にも書き込めないようにする「const 関数」の制限を緩めることもできます。関数が「const 関数」としてマークされている場合でも一部の変数を書き込み可能にするには、これらのクラス変数にキーワード を付けますmutable。したがって、クラス変数が可変としてマークされ、「const 関数」がこの変数に書き込む場合、コードは正常にコンパイルされ、変数は変更できます。(C++11)

キーワードを扱う場合と同様にconst、C++ ステートメントで const キーワードの位置を変更すると、まったく異なる意味になります。上記の の使用法は、関数宣言の括弧の後の末尾にconst追加する場合にのみ適用されます。const

constは C++ で非常に頻繁に使用される修飾子です。構文と順序はポインタと組み合わせると単純ではないことがよくあります。const正確性とconstキーワードに関するいくつかの資料:

定数の正確性

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

おすすめ記事