2016-08-31 6 views
2

ここで静的メンバーを変更することができるconstメンバー関数について複数の回答がありました。しかし、私の質問が同じカテゴリに入るかどうかは分かりません。私の例では、静的メンバー関数は、クラスの静的メンバーではなく、その静的メンバーを変更します。私の例はなぜ機能するのですか?constメンバー関数が自分のクラスの静的オブジェクトを変更しました

class Base 
{ 
public: 
    virtual const Base& fun (const Base& n) const = 0; 
}; 

class Child : public Base 
{ 
    int content; 
public: 
    Child(int i = 0) : content(i) {} 
    const Base& fun (const Base& n) const; 
}; 

const Base& Child::fun (const Base& n) const 
{  
    static Child static_child; 
    static_child.content = content + static_cast<const Child&>(n).content; 
    cout << "static child content is " << static_child.content << endl; 
    return static_child; 
} 

int main() { 
    Child c(10); 
    Base* b = &c; 
    b->fun(*b).fun(*b); 
} 

出力は

static child content is 20 
static child content is 30 

だから、constの機能正常に変更子オブジェクトになります。また、2回目の呼び出しではオブジェクトに変更されました。ありがとう。

+0

あなたのコードが変更するのは、非constオブジェクトである 'static_child'です。 –

答えて

3

したがってconst関数は正常に変更された子オブジェクトです。また、2回目の呼び出しではオブジェクトに変更されました。

thisが変更されていません。 c.contentは、プログラムの最後に10のままです。メンバ関数のconst修飾は、単にクラスインスタンスの非staticメンバー以外のmutableを変更できないようにします。しかしあなたはそれをやっていません - あなたはローカルのメンバーを変更していますstatic。それはconst資格で約束されたものではなく、あなたのプログラムで見ているように、完全に合法です。

+0

この変更に関して - 申し訳ありませんが、メインコードを入力してください。一定。 – Bob

+0

@Bobだからあなたの質問は何ですか?あなたは疑問のあることをするためにコンパイラをだますことができますか? – Barry

+0

この変更について - 申し訳ありませんが、メインコードを入力してください。一定。今、「楽しい」は** this **を変更します。私はconst資格についての説明をまだ得ていない... 'static_child'は、クラスChildのオブジェクトですか?はい。クラスChildのオブジェクトは非静的メンバー 'content'を持っていますか?はい。静的クラスオブジェクトの 'content'と非静的クラスオブジェクトの' content'との違いは? – Bob

関連する問題