プログラミング原人の進化ログ

プログラミング原人の進化論

オレ プログラミング ベンキョウ スル。マナンダ コト カク。

【C++】コンストラクタのオーバーロード

プロコンの本を読んでいたら、1つのクラスの中にいきなり2つのコンストラクタの定義が出てきたので、なんぞこれと思って調べてみました。勉強した内容をまとめておきます。

コンストラクタのオーバーロード

一般的にオーバーロードとは同じものに対して複数の定義を行うことを指しますが、C++ではコンストラクタもオーバーロードすることができます。やり方としては、単に複数のコンストラクタを定義してやるだけです。

何ができるのか

例えば、異なる型の引数を同じ形で渡すことが可能になります。異なる数の引数を渡すなどもできます。コンストラクタの方で色々な引数に対する初期化を定義してやることで、使う方はそれらにいちいち気を使わずに済むという利点があります。
ジェネリックプログラミングと関わりが深いみたいですねー。

使ってみる

タイマーです。初期化の際に引数に時間を与え、スタートしてからその時間が経過したらそれを知らせるプログラムです。 引数の時間は、整数の秒数、文字列の秒数、整数の分・秒で与えることができるようにしてあります。

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

class Timer {
  int seconds;

public:
  // 秒数を文字列で渡す
  Timer(const char *t) {
    seconds = atoi(t);
  }
  // 秒数を整数で渡す
  Timer (int t) {
    seconds = t;
  }
  // 時刻を分と秒で与える
  Timer (int min, int sec) {
    seconds = min * 60 + sec;
  }

  void run();
};

void Timer::run() {
  clock_t t1, t2;

  t1 = t2 = clock();
  while (seconds) {
    if (t1 / CLOCKS_PER_SEC + 1 <= (t2 = clock()) / CLOCKS_PER_SEC) {  // 1秒ごとに以下の処理を行う
      seconds--;
      t1 = t2;
    }
  }

  cout << "PPPPPPP" << endl;
} 

int main() {
  Timer a(10), b("20"), c(1, 10);

  a.run();
  b.run();
  c.run();

  return 0;
}

まとめ

単に複数の定義を並べるだけで勝手に適当なコンストラクタを適用してくれるんですね。簡単。

参考

ハーバート・シルト(2009)「標準講座C++」柏原正三訳・監修 株式会社トップスタジオ