クラス: オブジェクト指向の核
データと振る舞いをセットにする「カプセル化」を学ぶ。
クラス
データ(メンバ変数)と操作(メンバ関数)を一つにまとめたユーザー定義型。
カプセル化
外部から直接データを触らせず、メソッドを通して操作させることで安全性を保つ仕組み。
コンストラクタ
オブジェクトが生成されるときに自動的に呼ばれる初期化用の関数。
デストラクタ
オブジェクトが破棄されるときに自動的に呼ばれる後始末用の関数。
メンバ初期化子リスト
コンストラクタの引数リストの後ろに : で記述する、メンバ変数を初期化するための構文。
詳細解説
クラスの構成要素
- private: クラスの内側からしかアクセスできない領域。データはここに置くのが基本です。
- public: クラスの外側からアクセスできる領域。操作(メソッド)はここに置きます。
- コンストラクタ: オブジェクトが作られた瞬間に呼ばれます。データの初期設定を行います。
// 銀行口座クラスclass BankAccount {private: // メンバ変数は非公開(カプセル化) // 末尾にアンダースコアをつけるのが一般的な規則の一つ std::string owner_; int balance_;
public: // コンストラクタ:初期化リストを使って変数を初期化 BankAccount(std::string owner, int initial_balance) : owner_(owner), balance_(initial_balance) { // コンストラクタ本体でバリデーションなどができる if (balance_ < 0) balance_ = 0; }
// デストラクタ:オブジェクト破棄時の処理(必要なら) ~BankAccount() { std::cout << "Account closed: " << owner_ << std::endl; }
// const メソッド:メンバ変数を変更しないことを保証 int getBalance() const { return balance_; }
void deposit(int amount) { if (amount > 0) balance_ += amount; }};
// 使用例{ BankAccount myAccount("Alice", 1000); myAccount.deposit(500); std::cout << myAccount.getBalance() << std::endl; // 1500} // ここでデストラクタが呼ばれる実行結果
1500\nAccount closed: Alice
Class vs Struct
C++では `class` と `struct` はほぼ同じ機能ですが、デフォルトのアクセス権限が異なります。
| キーワード | デフォルトのアクセス | 主な使い分け |
|---|---|---|
class | private | ロジックを持つオブジェクト、カプセル化が必要な場合 |
struct | public | 単なるデータの集まり(DTOなど) |
// struct はデフォルトで publicstruct Data { int id; // public std::string name; // public};
// class はデフォルトで privateclass Manager { int id; // privatepublic: void doWork();};実践テクニック
メンバ初期化子リストを使う
コンストラクタの中身で代入するのではなく、初期化リスト(: の後ろ)を使うのがC++の流儀です。特に `const` メンバや参照メンバは、初期化リストでしか初期化できません。
class User { const std::string name_; // constメンバ int& ref_; // 参照メンバ
public: // ❌ Bad: 代入による初期化 // User(std::string name, int& ref) { // name_ = name; // エラー! constメンバには代入不可 // ref_ = ref; // エラー! 参照は初期化必須 // }
// ✅ Good: 初期化リスト User(std::string name, int& ref) : name_(name), ref_(ref) {} // ここで初期化される};演習課題
課題1: カウンタークラス
`Counter` クラスを作成してください。現在のカウント値を保持する `count_` (private) を持ち、値を1増やす `increment()`、現在の値を取得する `get()` (const) を実装してください。コンストラクタで初期値を設定できるようにしてください。
合格ライン
カプセル化(private変数 + publicメソッド)の意義を説明できる
メンバ初期化子リストを使ってコンストラクタを書ける
const メソッドの意味(メンバを変更しない)を理解している