{ } 初期化(統一初期化)も理解する
クラスの中で、オブジェクトを作るときに自動的に呼ばれる特別な関数です。
クラス名と同じ名前で、void や return を書かないのが特徴です。
class クラス名 { public: クラス名(引数...) { // 初期化処理 } };
これを使うと、オブジェクトを作るときに 初期値を一度に設定 できます。
コンストラクタは、オブジェクトを作った瞬間に自動的に呼ばれる関数です。
プログラマが new や変数宣言をしたとき、C++が自動で呼び出してくれます。
オブジェクトを作った「その瞬間」に呼ばれます。
Student s1("山田", 85); // ← この行が実行されたとき
このときC++は次の手順で動きます:
1. メモリ上に s1 の領域を確保する
2. クラスのコンストラクタ Student(string, int) を自動的に呼び出す
3. コンストラクタの中の処理を実行して、メンバ変数を初期化する
→ この一連の動きは、プログラマが「明示的に呼ばなくても」自動で行われます。
コンストラクタの中では、そのオブジェクトが持つメンバ変数 が初期化されます。
class Student { public: string name; int score; Student(string n, int s) { name = n; // ← ここで「s1.name」に "山田" が入る score = s; // ← ここで「s1.score」に 85 が入る } };
このように、s1、s2、s3 はそれぞれ独立したデータを持ちます。
同じクラスでも、オブジェクトごとに違う値を初期化できるのがコンストラクタの役割です。
| 内容 | 意味 |
|---|---|
| 呼ばれるタイミング | オブジェクトを作った瞬間(自動実行) |
| 初期化されるもの | そのオブジェクトのメンバ変数 |
| 呼び出し方 | Student(“山田”, 85); などの宣言時 |
| 役割 | メンバ変数を安全にセットし、使える状態にする |
目的: コンストラクタを使って、名前と点数をまとめて初期化する。
#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() がコンストラクタ。 Student s1(“山田”, 85); のように作ると、自動で初期化される。 Student s3{“田中”, 75};)も同じ意味。 → 統一初期化(Uniform Initialization) と呼ばれる。
showInfo() はオブジェクトの持つデータをまとめて表示する「動作」。Student s1 ├─ name = "山田" ├─ score = 85 └─ showInfo() → 山田 さんの点数は 85 点です。
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クラス」を作り、メンバ関数でオブジェクトの状態(メンバ変数の値)を変更する操作を学びます。