C++のconst
キーワードは、メンバー関数の最後(引数リストの後)に記述されている場合、正確にはどういう意味ですか?
だということだ *this
は、そのメンバー関数内のconst
です。つまり、オブジェクトを変更しません。
キーワード
this
はprvalue式であり、その値は関数が呼び出されるオブジェクトのアドレスです。クラスthis
のメンバー関数のX
の型はX*
。メンバー関数がconst
として宣言されている場合、this
の型はconst X*
。 [セクション9.3.2§1]
const
メンバー関数では、関数が呼び出されるオブジェクトはconst
アクセスパスを介してアクセスされます。したがって、const
メンバー関数は、オブジェクトとその非静的データメンバーを変更しません。 [セクション9.3.2§2]
これは、クラスのconst
インスタンスでconst
メンバー関数を呼び出すことができることを意味します。 const
以外のメンバー関数を呼び出すことはできません [1]潜在的に変更を試みる可能性があるため、const
オブジェクト。
[1] 注:テンポラリは、const
型でない限り、const
オブジェクトではありません。
関数シグネチャの末尾のconst
は、その関数がメンバーであるオブジェクトがconst
であると想定する必要があることを意味します。実際には、コンパイラにcheckを要求することを意味します。メンバー関数がオブジェクトデータを変更しないようにします。これは、コンパイラにメンバーデータを直接変更しないことを確認するように依頼することを意味します。また、オブジェクトを変更しないことを保証しない関数自体は呼び出しません。
const
オブジェクトを作成するとき、そのオブジェクトがその初期化を超えて変化しないことを確認するようコンパイラーに求めています。つまり、コンパイラは、メンバーデータを直接変更しないことをチェックし、オブジェクトが変更されないことを保証しない関数を呼び出さないことを意味します。
これはすべてconst correctness哲学の一部です。本質的に、それは、物事が今すぐ機能し、それらが変わらない場合、決して壊れないことを意味します。言い換えれば、一定のものは確実に作業しやすいです。関数シグネチャの最後にあるこのconst
のことは、物事が壊れることを禁止するためのツールです。これは、可能な限りあらゆる場所にconst
を配置する必要があることを意味します。
コンパイラーの最適化は可能ですが、主な利点は、関数の宣言で表されるコントラクトを実施することです-メンバー関数をconst
として定義すると、コンパイラーはその関数内のオブジェクトの変更を防ぎます。
宣言でmutable
を使用して、クラス内の個々のフィールドをこの制限から除外できます。これは、たとえば、独自のlock_guardをカプセル化するクラスがあり、その値を変更してconst
メンバー関数内でもスレッドセーフを適用する必要がある場合に役立ちます。