どのように書くのが正しいですか:
bool const f(...);
or bool f(...) const ;
or const bool f(...) ;
それらの間に違いがあるかどうかを意味しますか?
どのように書くのが正しいですか:
bool const f(...);
or bool f(...) const ;
or const bool f(...) ;
それらの間に違いがあるかどうかを意味しますか?
const bool f();
その値を決して変更しないconst boolを返すと言いますbool f() const;
f は、クラス内の変数を変更しない const 関数であると言いますケース 1 ではconst bool f();
、返された bool を const として宣言し、宣言時またはクラスのコンストラクターで初期化する必要があります。
const bool f() { return m_bool; }
m_bool は次のように宣言されます。const bool m_bool = false;
ケース 2 の場合bool f() const;
、戻り値は決して変更されないことを保証しませんが、関数自体は、クラス内のデータ メンバーを変更せず、const として宣言されていないメンバー関数を呼び出さないことを保証します。(一部例外あり)
bool f() const { return m_bool; } // valid
bool f() const { m_bool = false; return m_bool; } // invalid, m_bool cannot be changed from a const function.
m_bool は、またはのいずれかとして宣言できますconst bool m_bool = false;
。bool m_bool;
1 と 3 は同じもので、 と の順序が異なるだけconst
ですbool
。これら 2 つは、返される bool が定数であることを意味します。しかし、あなたのコードは のようなことをしている可能性が高いbool b = myobject.f();
ので、変数はとにかくb
によって返された値のコピーであるため、違いはありません。f()
2 はthis
、関数内のポインターをf()
a const T *this
(T はクラス) にします。つまり、クラス内の変更は許可されません。それはおそらくあなたが最初に求めていたものです。
関数名の前に来るのは戻り値の型です。in a 型は、そのconst
左側に何もない場合を除き、その左側にあるものすべてに適用されます。その場合、右側にあるものすべてに適用されます。したがって、1 番目と 3 番目の戻り値の型はconst
bool
s で、2 番目は非const
bool
です。const
戻り値の型があるということは、返される値を変更できないことを意味します。
関数const
の引数リストの後にあると、関数は関数になりconst
ます。これは、メンバー関数 (つまり、クラスで宣言されたもの) にのみ適用されます。const
メンバー関数は、オブジェクトでのみ呼び出すことができますconst
。したがってfoo
、const
メンバー関数f
以外のクラスがある場合、これを行うことはできません。
const foo a_foo;
a_foo.f(); // Error because a_foo is const but f is not a const member function
したがって、オプション 1 と 3 はどちらも同じです - それらはconst
a を返す非関数でconst bool
あり、オプション 2 は異なります - それは aconst
を返す関数ですbool
。