🎓 第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. まとめると
| 内容 | 意味 |
|---|---|
| 呼ばれるタイミング | オブジェクトを作った瞬間(自動実行) |
| 初期化されるもの | そのオブジェクトのメンバ変数 |
| 呼び出し方 | Student(“山田”, 85); などの宣言時 |
| 役割 | メンバ変数を安全にセットし、使える状態にする |
🧮 例題:Studentクラス
目的: コンストラクタを使って、名前と点数をまとめて初期化する。
#include <iostream> #include <string> 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{“名前”, 点数};のように書ける。- 点数ごとにランクが正しく出るか確認してみよう。
🎯 まとめ
| 覚えるポイント | 内容 |
|---|---|
| コンストラクタ | オブジェクト作成時に自動で呼ばれる |
Student a(“太郎”, 90); | 丸かっこ初期化 |
Student b{“花子”, 80}; | 中かっこ初期化(統一初期化) |
void を書かない | コンストラクタは戻り値を持たない |
| メンバ関数 | オブジェクトの情報を扱う関数 |
📘 次回のステップ → 第3章では「BankAccountクラス」を作り、メンバ関数でオブジェクトの状態(メンバ変数の値)を変更する操作を学びます。