本文へスキップ
BecomeCoder

C++コース · 第10章 クラスの基礎 ― 自分だけの型を作る · レッスン39

コンストラクタ ― 生成時に初期化する

ブラウザで完結

導入

インスタンスを作った直後にメンバを初期化したい――そのための特別なメンバ関数が「コンストラクタ」です。作り忘れ・初期化忘れを防ぐ、クラスの重要な仕組みです。

説明

コンストラクタは「クラス名と同じ名前・戻り値なし」の関数で、インスタンス生成時に自動で呼ばれます。

#include <iostream>
#include <string>
using namespace std;

class Dog {
public:
    string name;
    int age;

    Dog(string n, int a) {   // コンストラクタ(作るときに呼ばれる)
        name = n;
        age = a;
    }
    void bark() {
        cout << name << "(" << age << "歳): ワン!" << endl;
    }
};

int main() {
    Dog pochi("ポチ", 3);    // 生成と同時に name, age が入る
    pochi.bark();            // ポチ(3歳): ワン!
    return 0;
}

引数の違うコンストラクタを複数用意できます(オーバーロード)。引数なしで作れるようにする「デフォルトコンストラクタ」も定義できます。

flowchart TB
  a["Dog()<br/>引数なし → 既定値で作る"]
  b["Dog(string n)<br/>名前だけ指定"]
  c["Dog(string n, int a)<br/>名前と年齢を指定"]
  a --- b --- c
#include <iostream>
#include <string>
using namespace std;

class Dog {
public:
    string name;
    int age;

    Dog() { name = "名無し"; age = 0; }          // 引数なし
    Dog(string n, int a) { name = n; age = a; }  // 引数あり
};

int main() {
    Dog a;                 // 引数なし → 名無し, 0
    Dog b("ハチ", 5);      // 引数あり
    cout << a.name << " / " << b.name << endl;   // 名無し / ハチ
    return 0;
}

まとめ

コンストラクタは「生成時の初期化」を保証する仕組みです。名前はクラス名と同じ・戻り値なし。引数違いで複数用意でき、初期化忘れによるバグを防げます。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。