どのように書くのが正しいですか:
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 bools で、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 はどちらも同じです - それらはconsta を返す非関数でconst boolあり、オプション 2 は異なります - それは aconstを返す関数ですbool。