私はまだC++について学習しており、const
を使用する必要があるすべての場所を読んでいます(速度上の理由から)。
私は通常、次のようにゲッターメソッドを記述します。
const bool isReady() {
return ready;
}
しかし、私はいくつかのIDE=この方法でゲッターを自動生成することを見ました:
bool getReady() const {
return ready;
}
しかし、デリゲートを書くと、const
が関数の後ろにある場合にこのエラーを見つけることがありました。
member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const
それで、constゲッターを書くためのより良い方法は何ですか?私は本当に気にする必要がありますか?
2つの方法には大きな違いがあります。
const bool isReady()
上記のコードはconst bool
を返しますが、オブジェクトがその論理状態を変更しないことを保証するものではありません。
bool isReady() const
これはbool
を返し、オブジェクトのロジック状態が変化しないことを保証します。この場合、戻り値の型の前にconst
を記述する必要はありません。とにかくコピーなので、const bool
を返すのは意味がありません。したがって、const
を作成しても意味がありません。 2番目のconst
は const
correctness に必要ですが、速度の理由からではなく、プログラムの信頼性と安全性を高めるために使用されます。
彼らは2つの異なることを意味します:
const bool isReady() {
return ready;
}
これは定数boolを返します。作成された時点から値を変更できないブールを意味します。
bool getReady() const {
return ready;
}
これは定数関数です。つまり、それが属するクラスのメンバー変数を変更しない関数です。これはデータを取得することだけを目的としており、プロセス内の何も変更してはならないため、getterの使用に推奨されるスタイルです。
const
メソッドは、このメソッドが呼び出されるクラスインスタンスを変更しないことをコンパイラに通知します。
class A {
public:
bool getReady() const {
return ready;
}
};
そのため、getReady()内でオブジェクトを変更しようとすると、コンパイラーはエラーを発行します。 constメソッドは、つまりconst A&、またはconst A *がある場合に便利です。その場合、そのようなオブジェクトではconstメソッドのみを呼び出すことができます。
はどうかと言うと:
const bool isReady() {
return ready;
}
isReady()が戻るときにboolがコピーされるため、このconstは実際には実際の利点を提供しません。そのようなconst
は、返された型がconst char*
またはconst A&
、そのような場合、const
は、char文字列またはAクラスインスタンスを不変にします。
Const getterには署名があります
bool getReady() const
他のバージョンはconst
メソッドではなく、単にconst
値を返します(これは基本的に役に立たない)。
const
ゲッターがあると、constオブジェクトで呼び出すことができます。
const Object obj;
obj.getReady();
これは、getReady
がconst
としてマークされている場合にのみ有効です。
戻り値の型またはメソッドのシグネチャでのconst
キーワードの使用には違いがあります。最初のケースでは、戻り値は定数値になります。 2番目のケースでは、メソッドはいわゆる定数メソッドであり、オブジェクトの表現を変更できません。定数オブジェクトでは、定数メソッドのみを呼び出すことができます。