web-dev-qa-db-ja.com

関数/メソッドのシグネチャに従うとconstはどういう意味ですか?

MSDNによると、「メンバー関数のパラメーターリストに従う場合、constキーワードは、関数が呼び出されるオブジェクトを変更しないことを指定します。」

誰かがこれを少し明確にすることができますか?関数がオブジェクトのメンバーを変更できないことを意味しますか?

 bool AnalogClockPlugin::isInitialized() const
 {
     return initialized;
 }
32
Scott

これは、メソッドがメンバー変数を変更しないことを意味し(mutableとして宣言されたメンバーを除く)、クラスの定数インスタンスで呼び出すことができます。

class A
{
public:
    int foo() { return 42; }
    int bar() const { return 42; }
};

void test(const A& a)
{
    // Will fail
    a.foo();

    // Will work
    a.bar();
}
36
Pierre Bourdon

また、メンバー関数は可変としてマークされていないメンバー変数を変更できませんが、メンバー変数がポインターの場合、メンバー関数はポインター値(つまり、ポインターが指すアドレス)を変更できない場合がありますが、ポインタが指すもの(実際のメモリ領域)を変更できます。

したがって、たとえば:

class C
{
public:
    void member() const
    {
        p = 0; // This is not allowed; you are modifying the member variable

        // This is allowed; the member variable is still the same, but what it points to is different (and can be changed)
        *p = 0;
    }

private:
    int *p;
};
16
blwy10

コンパイラーは、constメンバー関数が* thisを変更したり、このオブジェクトの非constメンバー関数を呼び出したりすることを許可しません。

2
Satbir

@delrothが回答したように、これは、メンバー関数が、可変として宣言されたものを除いて、memeber変数を変更しないことを意味します。 C++でのconstの正当性についての良いFAQ)を見ることができます ここ

2
Naveen