この章では、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;
}
};// 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 が現れた!
次の要件を満たす Account クラスを作成しなさい。
balance を private にするdeposit(int) で入金できるpay(int) で出金できるshow() で現在の残高を表示できるmain関数にて:
deposit と pay
を交互に呼び出しshow()
によって残高が正しく表示されることを確認せよ// 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++のコンストラクタは「引数違いで複数定義(オーバーロード)」することも可能です。
private にした変数は
public な関数で操作する