====== 🎓 第2章 コンストラクタを使ってみよう:Studentクラス ======
===== 🏁 学習目標 =====
* コンストラクタ(初期化の仕組み)を理解する
* オブジェクトを作るときに、値をまとめて設定する方法を学ぶ
* 中かっこによる ''{ }'' 初期化(統一初期化)も理解する
----
===== 💬 コンストラクタとは? =====
クラスの中で、**オブジェクトを作るときに自動的に呼ばれる特別な関数**です。
クラス名と同じ名前で、''void'' や ''return'' を書かないのが特徴です。
class クラス名 {
public:
クラス名(引数...) {
// 初期化処理
}
};
これを使うと、オブジェクトを作るときに **初期値を一度に設定** できます。
----
===== 💡 コンストラクタのしくみ =====
コンストラクタは、**オブジェクトを作った瞬間に自動的に呼ばれる関数**です。
プログラマが ''new'' や変数宣言をしたとき、C++が自動で呼び出してくれます。
==== 🧩 1. いつ呼ばれるの? ====
オブジェクトを作った「その瞬間」に呼ばれます。
Student s1("山田", 85); // ← この行が実行されたとき
このときC++は次の手順で動きます:
1. メモリ上に ''s1'' の領域を確保する
2. クラスのコンストラクタ ''Student(string, int)'' を自動的に呼び出す
3. コンストラクタの中の処理を実行して、メンバ変数を初期化する
→ この一連の動きは、プログラマが「明示的に呼ばなくても」自動で行われます。
==== ⚙️ 2. 何が初期化されるの? ====
コンストラクタの中では、**そのオブジェクトが持つメンバ変数** が初期化されます。
class Student {
public:
string name;
int score;
Student(string n, int s) {
name = n; // ← ここで「s1.name」に "山田" が入る
score = s; // ← ここで「s1.score」に 85 が入る
}
};
このように、''s1''、''s2''、''s3'' はそれぞれ独立したデータを持ちます。
同じクラスでも、**オブジェクトごとに違う値を初期化できる**のがコンストラクタの役割です。
==== 💡 3. まとめると ====
|< tablewidth 45% >|
|< 50% 50% >|
^ 内容 ^ 意味 ^
| 呼ばれるタイミング | オブジェクトを作った瞬間(自動実行) |
| 初期化されるもの | そのオブジェクトのメンバ変数 |
| 呼び出し方 | ''Student("山田", 85);'' などの宣言時 |
| 役割 | メンバ変数を安全にセットし、使える状態にする |
----
===== 🧮 例題:Studentクラス =====
**目的:** コンストラクタを使って、名前と点数をまとめて初期化する。
#include
#include
using namespace std;
class Student {
public:
string name;
int score;
// コンストラクタ
Student(string n, int s) {
name = n;
score = s;
}
// メンバ関数:情報を表示する
void showInfo() {
cout << name << " さんの点数は " << score << " 点です。" << endl;
}
};
int main() {
// (1)普通のコンストラクタ呼び出し
Student s1("山田", 85);
Student s2("佐藤", 92);
// (2)中かっこ { } を使った統一初期化(同じ意味)
Student s3{"田中", 75};
s1.showInfo();
s2.showInfo();
s3.showInfo();
}
**実行結果**
山田 さんの点数は 85 点です。
佐藤 さんの点数は 92 点です。
田中 さんの点数は 75 点です。
**ポイント**
* クラス名と同じ関数 ''Student()'' がコンストラクタ。
* main関数で ''Student s1("山田", 85);'' のように作ると、自動で初期化される。
* 中かっこの書き方(''Student s3{"田中", 75};'')も同じ意味。
→ **統一初期化(Uniform Initialization)** と呼ばれる。
* ''showInfo()'' はオブジェクトの持つデータをまとめて表示する「動作」。
----
===== 🔍 イメージ図 =====
Student s1
├─ name = "山田"
├─ score = 85
└─ showInfo() → 山田 さんの点数は 85 点です。
----
===== 🧩 練習問題(第2問) =====
**Studentクラスを少し拡張してみよう。**
次の仕様でクラスを完成させよ。
// クラス名: Student
// - メンバ変数: name, score, grade(成績ランク)
// - コンストラクタ: 名前と点数を受け取って初期化
// - メンバ関数:
// 1. judgeGrade() … 点数に応じて grade を決める
// (90点以上A、70点以上B、50点以上C、それ未満はD)
// 2. showInfo() … 名前・点数・ランクを表示する
//
// main()で3人のStudentを作り、全員の情報を表示せよ。
// 作成時は "()" でも "{}" でもどちらでもOK。
//
// 出力例:
// 山田 さんの点数は 85 点、評価は B です。
// 佐藤 さんの点数は 92 点、評価は A です。
// 田中 さんの点数は 48 点、評価は D です。
**ヒント**
* ''judgeGrade()'' の中で ''if'' 文を使おう。
* ''showInfo()'' で ''grade'' を一緒に出力する。
* ''Student s{"名前", 点数};'' のように書ける。
* 点数ごとにランクが正しく出るか確認してみよう。
----
===== 🎯 まとめ =====
|< 45% 50% 50% >|
^ 覚えるポイント ^ 内容 ^
| コンストラクタ | オブジェクト作成時に自動で呼ばれる |
| ''Student a("太郎", 90);'' | 丸かっこ初期化 |
| ''Student b{"花子", 80};'' | 中かっこ初期化(統一初期化) |
| ''void'' を書かない | コンストラクタは戻り値を持たない |
| メンバ関数 | オブジェクトの情報を扱う関数 |
----
📘 **次回のステップ**
→ 第3章では「BankAccountクラス」を作り、メンバ関数でオブジェクトの状態(メンバ変数の値)を変更する操作を学びます。