C++超入門⑨ クラスの基本を知ろう
class、オブジェクト、public、private、コンストラクタ、メンバー関数を使い、データと処理を一つにまとめます。
第9回では、C++でよく使われるクラスの基本を学びます。
構造体が関係するデータをまとめる仕組みなら、クラスはデータと、そのデータを操作する処理をまとめる仕組みです。
この回でできるようになること
- classで新しい型を作る
- publicとprivateを使い分ける
- コンストラクタで最初の状態を作る
- メンバー関数でデータを変更する
クラスの基本
プレイヤーの名前とHP、それを操作する処理をクラスへまとめます。
#include <iostream>
#include <string>
class Player {
public:
Player(std::string initialName) {
name = initialName;
}
void takeDamage(int damage) {
hp = hp - damage;
if (hp < 0) {
hp = 0;
}
}
void show() {
std::cout << name << ": HP " << hp << '\n';
}
private:
std::string name;
int hp = 100;
};
class Playerの中に、データと関数が入っています。
クラスの中にある関数をメンバー関数と呼びます。
publicとprivate
| 指定 | 意味 |
|---|---|
| public | クラスの外から使える |
| private | クラスの中だけで使える |
この例では、takeDamageとshowは外から使えます。nameとhpは外から直接変更できません。
HPをprivateにすると、マイナスにならないようにする処理を必ずtakeDamageの中で通せます。
コンストラクタ
クラス名と同じ名前を持つ、戻り値のない特別な関数をコンストラクタと呼びます。
Player(std::string initialName) {
name = initialName;
}
Player型の値を作ったときに自動で呼ばれ、最初の名前を設定します。
オブジェクトを作る
クラスを設計図として、実際に作った値をオブジェクトと呼びます。
int main() {
Player hero("Aoi");
hero.show();
hero.takeDamage(30);
hero.show();
return 0;
}
実行結果は次のようになります。
Aoi: HP 100
Aoi: HP 70
hero.takeDamage(30)のように、ドットを使ってメンバー関数を呼び出します。
構造体とクラスの違い
C++では、structでも関数やprivateを使えます。classとの大きな違いは、何も指定しなかった場合の公開範囲です。
| 書き方 | 初期状態 |
|---|---|
| struct | public |
| class | private |
学び始めのうちは、データを分かりやすくまとめるだけならstruct、データを守りながら処理もまとめたいならclass、と考えるとよいでしょう。
小さな練習
残高を保存するBankAccountクラスを作ってください。
- privateにint balanceを用意する
- publicにdeposit関数を用意する
- show関数で現在の残高を表示する
余裕があれば、0より小さい金額は追加しないようにif文を使ってみましょう。
模範解答
#include <iostream>
class BankAccount {
public:
void deposit(int amount) {
if (amount > 0) {
balance += amount;
}
}
void show() {
std::cout << "残高: " << balance << "円\n";
}
private:
int balance = 0;
};
int main() {
BankAccount account;
account.deposit(3000);
account.deposit(-500);
account.show();
return 0;
}
解説
balanceはprivateなので、クラスの外から直接変更できません。depositの中で0より大きい金額だけを加えるため、-500は無視され、残高は3000円と表示されます。
まとめ
- クラスは、データとそれを操作する関数をまとめます。
- privateを使うと、外から勝手に値を変更できないようにできます。
- クラスから作った実際の値をオブジェクトと呼びます。