今日覚えたこと

・mutable修飾子
constなメンバ関数は基本的にインスタンス変数を変更できない。
しかし、まれにインスタンス変数を変更してないはずなのに、内部的に変数を変換しているためにconstを指定出来ない場合がある。
こういう場合にmutableを指定すると、指定されたメンバ変数はconstを指定したメンバ関数内でも変更出来るようになる。

class A
{
private:
 char* text;
 mutable int ref;
public:
 A() : ref(0), text("test") {}

 // const指定のメンバ関数ないで値を変更出来る
 const char* GetText() const
 {
  ref++;
  return text;
 }
};

あまりいい例ではないが、こういうことが出来る。


・explicit修飾子
C++では、引数の型が異なる場合に、対応するコンストラクタがあれば暗黙のうちに呼び出されることがあるが、explicitをつけると明示的にコードに書かない限り呼び出されない。

例えば、
class A
{
public:
 A(int a) {} // NG
 explicit A(int a) {} // OK
};

class B
{
public:
 B(int b) {}
};

void func(const A& a) {}
void func(const B& b) {}

int main()
{
 func(0);
 return 0;
}

この場合はexplicitをつけないと、どっちのfuncを呼び出せばいいか分からないのでエラーとなる。