キーワードconst(3)--mutableキーワード
1327 ワード
メンバー関数の後にconstを付けると、クラスのデータ・メンバーは変更できません.たとえば、次のようになります.
もちろん、mutableキーワードで修飾されたメンバー変数がconst関数として宣言されることで変更できる場合があります.mutableについて:
キーワードmutableは、クラスの非静的および非常に多くのデータメンバーにのみ使用できるC++の一般的でないキーワードです.1つのオブジェクトの状態は、そのオブジェクトの非静的データメンバーによって決定されることを知っています.したがって、データメンバーが変化するにつれて、オブジェクトの状態も変化します.クラスのメンバー関数がconstタイプとして宣言された場合、その関数はオブジェクトの状態を変更しないことを示します.つまり、クラスの非静的データメンバーは変更されません.しかし、クラス関数にクラスのデータメンバーを割り当てる必要がある場合があります.mutableキーワードを使用する必要があります.
例:
上記のコードをコンパイルするとerror C 2166:l-value specifies const objectのエラーが発生し、constタイプの関数でクラスの非静的データメンバーが変更されたことを示します.
この場合、constメンバー関数で変更する非静的データメンバーm_をmutableで修飾する必要があります.nAccess、コードは以下の通りです.
これで再コンパイル時にエラーは発生しません.
class A{
private:
int aa;
public:
int x(){
return aa++;
} //
int x() const{
return aa++;
} //
};
もちろん、mutableキーワードで修飾されたメンバー変数がconst関数として宣言されることで変更できる場合があります.mutableについて:
キーワードmutableは、クラスの非静的および非常に多くのデータメンバーにのみ使用できるC++の一般的でないキーワードです.1つのオブジェクトの状態は、そのオブジェクトの非静的データメンバーによって決定されることを知っています.したがって、データメンバーが変化するにつれて、オブジェクトの状態も変化します.クラスのメンバー関数がconstタイプとして宣言された場合、その関数はオブジェクトの状態を変更しないことを示します.つまり、クラスの非静的データメンバーは変更されません.しかし、クラス関数にクラスのデータメンバーを割り当てる必要がある場合があります.mutableキーワードを使用する必要があります.
例:
class Demo{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const{
m_nAccess++;
return m_bFlag;
}
private:
int m_nAccess;
bool m_bFlag;
};
int main(){
return 0;
}
上記のコードをコンパイルするとerror C 2166:l-value specifies const objectのエラーが発生し、constタイプの関数でクラスの非静的データメンバーが変更されたことを示します.
この場合、constメンバー関数で変更する非静的データメンバーm_をmutableで修飾する必要があります.nAccess、コードは以下の通りです.
class Demo{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const{
m_nAccess++;
return m_bFlag;
}
private:
mutable int m_nAccess;
bool m_bFlag;
};
int main(){
return 0;
}
これで再コンパイル時にエラーは発生しません.