[解決済み] 関数宣言の最後の "const "は何を意味するのですか?[重複あり]
質問
ある本を手に入れたら、こんなことが書いてありました。
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
どういう意味ですか?
どのように解決するのですか?
キーワードで示されるquot;const関数"は
const
関数宣言の後に、このクラス関数がクラスのメンバ変数を変更すると、コンパイラ・エラーになります。 ただし、関数内部でのクラス変数の読み出しは問題ありませんが、この関数内部での書き込みはコンパイラー・エラーとなります。
このような "const function" について考えるもう一つの方法は、クラス関数を、暗黙のうちに
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関数"としてマークされている場合でも、一部の変数を書き込み可能にするために、これらのクラス変数には、キーワード
mutable
. したがって、クラス変数がmutableとマークされている場合、"const関数"がこの変数に書き込むと、コードはきれいにコンパイルされ、変数は変更することができます。(C++11)
を扱うときは、いつものように
const
キーワードは、C++文の中のconstキーワードの位置を変えることで、全く異なる意味を持ちます。 上記の使い方は
const
を追加した場合のみ適用されます。
const
の後、関数宣言の最後に括弧を付けます。
const
はC++で非常に多用される修飾子です。ポインタとの組み合わせでは、構文や順序が単純でないことがよくあります。ポインタとの組み合わせでは、構文や順序が単純ではないことがよくあります。
const
の正しさと
const
というキーワードがあります。
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] int argc, char *argv[] とはどういう意味ですか?
-
[解決済み] 関数のパラメータに 'const' を使用する
-
[解決済み] コンストラクタのコロンメンバー(" : ")の変な構文は何ですか?
-
[解決済み] const "と "val "の違いは何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】boolのprintfフォーマット指定子とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる