web-dev-qa-db-ja.com

ゲッターのC ++ const

私はまだ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ゲッターを書くためのより良い方法は何ですか?私は本当に気にする必要がありますか?

19
nkint

2つの方法には大きな違いがあります。

const bool isReady()

上記のコードはconst boolを返しますが、オブジェクトがその論理状態を変更しないことを保証するものではありません。

bool isReady() const

これはboolを返し、オブジェクトのロジック状態が変化しないことを保証します。この場合、戻り値の型の前にconstを記述する必要はありません。とにかくコピーなので、const boolを返すのは意味がありません。したがって、constを作成しても意味がありません。 2番目のconstconst correctness に必要ですが、速度の理由からではなく、プログラムの信頼性と安全性を高めるために使用されます。

42
mkaes

彼らは2つの異なることを意味します:

const bool isReady() {
    return ready;
}

これは定数boolを返します。作成された時点から値を変更できないブールを意味します。

bool getReady() const { 
    return ready;
}

これは定数関数です。つまり、それが属するクラスのメンバー変数を変更しない関数です。これはデータを取得することだけを目的としており、プロセス内の何も変更してはならないため、getterの使用に推奨されるスタイルです。

22
Diana

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クラスインスタンスを不変にします。

7
marcinj

Const getterには署名があります

bool getReady() const

他のバージョンはconstメソッドではなく、単にconst値を返します(これは基本的に役に立たない)。

constゲッターがあると、constオブジェクトで呼び出すことができます。

const Object obj;
obj.getReady();

これは、getReadyconstとしてマークされている場合にのみ有効です。

3
Luchian Grigore

戻り値の型またはメソッドのシグネチャでのconstキーワードの使用には違いがあります。最初のケースでは、戻り値は定数値になります。 2番目のケースでは、メソッドはいわゆる定数メソッドであり、オブジェクトの表現を変更できません。定数オブジェクトでは、定数メソッドのみを呼び出すことができます。

3
mcserep