====== 🎓 第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クラス」を作り、メンバ関数でオブジェクトの状態(メンバ変数の値)を変更する操作を学びます。