この章では、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++のコンストラクタは「引数違いで複数定義(オーバーロード)」することも可能です。
// 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;
}
Account クラスを作り、private な balance 変数を持たせるdeposit(int) で入金、pay(int) で出金できるメンバ関数を追加するshow() で残高を表示するshow() で残高を確認するAccount(int initial) { balance = initial; } のように書きます。deposit は balance += amount;、pay は balance -= amount; で実装できます。Account a(1000); で初期残高1000円のオブジェクトを作れます。
次のコードを実行すると何が表示されますか?
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 が現れた!」が表示されます。
コンストラクタの特徴として正しいものはどれですか?
クラス名 変数名(引数); のとき)に自動で呼ばれます。戻り値は書かず、名前はクラス名と同じです。
カプセル化の設計方針として正しいものはどれですか?
次のコードを実行すると最後に表示される残高はいくつですか?
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;
}
deposit(500) で1500円 → pay(300) で1200円になります。
private にした変数は public な関数で操作する