-2

どのように書くのが正しいですか:

bool const f(...);
or bool f(...) const ;
or const bool f(...)  ;

それらの間に違いがあるかどうかを意味しますか?

4

3 に答える 3

3
  1. const bool f();その値を決して変更しないconst boolを返すと言います
  2. 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;


const 変数の詳細については、こちらを参照してください。const 関数の詳細については、こちらを参照してください。

于 2013-02-09T15:21:29.260 に答える
2
  1. bool const f(...);
  2. bool f(...) const ;
  3. const ブール f(...) ;

1 と 3 は同じもので、 と の順序が異なるだけconstですbool。これら 2 つは、返される bool が定数であることを意味します。しかし、あなたのコードは のようなことをしている可能性が高いbool b = myobject.f();ので、変数はとにかくbによって返された値のコピーであるため、違いはありません。f()

2 はthis、関数内のポインターをf()a const T *this(T はクラス) にします。つまり、クラス内の変更は許可されません。それはおそらくあなたが最初に求めていたものです。

于 2013-02-09T15:20:07.763 に答える
0

関数名の前に来るのは戻り値の型です。in a 型は、そのconst左側に何もない場合を除き、その左側にあるものすべてに適用されます。その場合、右側にあるものすべてに適用されます。したがって、1 番目と 3 番目の戻り値の型はconst bools で、2 番目は非const boolです。const戻り値の型があるということは、返される値を変更できないことを意味します。

関数constの引数リストの後にあると、関数は関数になりconstます。これは、メンバー関数 (つまり、クラスで宣言されたもの) にのみ適用されます。constメンバー関数は、オブジェクトでのみ呼び出すことができますconst。したがってfooconstメンバー関数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

于 2013-02-09T15:20:39.760 に答える