12_コンストラクタとアクセス修飾子の活用

はじめに

この章では、C++におけるクラスの設計をさらに深めるため、

について学びます。

コンストラクタとは?

コンストラクタ(constructor) は、オブジェクトが作られたときに自動で実行される関数です。

// 12_constructor_basic.cpp
#include <iostream>
using namespace std;

class Player {
private:
    string name;

public:
    Player(string n) {
        name = n;
    }

    void greet() {
        cout << "こんにちは、" << name << " さん!" << endl;
    }
};

int main() {
    Player p("Yamada");  // オブジェクト作成時にコンストラクタが呼ばれる
    p.greet();

    return 0;
}

Player クラスのオブジェクト p を生成する際に、Player(string n) というコンストラクタが呼び出されます。

アクセス修飾子の使い分けとカプセル化

クラスの設計では、データは隠し(private)、操作は公開(public) するのが基本です。この設計方針を「カプセル化(Encapsulation)」と呼びます。

カプセル化によって、データを外部から守り、クラスの使い方を安全かつ統一的に保つことができます。

// 12_account_encapsulation.cpp
#include <iostream>
using namespace std;

class Account {
private:
    int balance;  // 外部から直接アクセスできない

public:
    Account() {
        balance = 0;
    }

    void deposit(int amount) {
        balance += amount;
    }

    void show() {
        cout << "残高: " << balance << "円" << endl;
    }
};

コンストラクタはなぜ重要?

C++では、オブジェクトを安全に初期化することが非常に重要です。コンストラクタを使うことで、オブジェクトの生成と同時に正しい状態で使い始めることができます。

また、C++のコンストラクタは「引数違いで複数定義(オーバーロード)」することも可能です。

コーディング演習

演習1:基本コードを動かす

12_01_constructor.cpp を作成し、次のコードを入力して実行しましょう。
// constructor_basic.cpp
#include <iostream>
using namespace std;

class Player {
private:
    string name;

public:
    Player(string n) {
        name = n;
    }

    void greet() {
        cout << "こんにちは、" << name << " さん!" << endl;
    }
};

int main() {
    Player p("Yamada");
    p.greet();
    return 0;
}

演習2:コードを改造する

12_01_constructor.cpp をコピーして 12_02_constructor_mod.cpp として保存し、次の変更を加えてみましょう:
ヒントを見る コンストラクタは Account(int initial) { balance = initial; } のように書きます。
depositbalance += amount;paybalance -= amount; で実装できます。
main関数では Account a(1000); で初期残高1000円のオブジェクトを作れます。

理解度チェック

問題12-1

次のコードを実行すると何が表示されますか?

class Hero {
private:
    string name;
public:
    Hero(string n) { name = n; }
    void show() { cout << name << " が現れた!" << endl; }
};

int main() {
    Hero h("Link");
    h.show();
    return 0;
}
解説を表示 正解:ア
コンストラクタ Hero("Link") が呼ばれ、name = "Link" が設定されます。show() で「Link が現れた!」が表示されます。

問題12-2

コンストラクタの特徴として正しいものはどれですか?

解説を表示 正解:イ
コンストラクタはオブジェクトが生成されたとき(クラス名 変数名(引数); のとき)に自動で呼ばれます。戻り値は書かず、名前はクラス名と同じです。

問題12-3

カプセル化の設計方針として正しいものはどれですか?

解説を表示 正解:ウ
カプセル化の基本は「データを隠す(private)、操作を公開する(public)」です。これにより外部から直接データが壊されるのを防ぎます。

問題12-4

次のコードを実行すると最後に表示される残高はいくつですか?

class Account {
private:
    int balance;
public:
    Account(int b) { balance = b; }
    void deposit(int a) { balance += a; }
    void pay(int a) { balance -= a; }
    void show() { cout << balance << "円" << endl; }
};

int main() {
    Account a(1000);
    a.deposit(500);
    a.pay(300);
    a.show();
    return 0;
}
解説を表示 正解:ウ
初期残高1000円 → deposit(500) で1500円 → pay(300) で1200円になります。

まとめ