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;
    }
};

理解度チェック

問題1(12_constructor_test.cpp)
// 12_constructor_test.cpp
#include <iostream>
using namespace std;

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;
}
正解・解説を見る
Link が現れた!

演習問題(12_bank_account.cpp)

次の要件を満たす Account クラスを作成しなさい。

main関数にて:

解答例を見る
// 12_bank_account.cpp
#include <iostream>
using namespace std;

class Account {
private:
    int balance;

public:
    Account(int initial) {
        balance = initial;
    }

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

    void pay(int amount) {
        balance -= amount;
    }

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

int main() {
    Account a(1000);  // 初期残高1000円

    a.deposit(500);
    a.show();         // 1500

    a.pay(300);
    a.show();         // 1200

    a.deposit(800);
    a.show();         // 2000

    return 0;
}

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

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

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


まとめ