クラス: オブジェクト指向の核

データと振る舞いをセットにする「カプセル化」を学ぶ。

クラス
データ(メンバ変数)と操作(メンバ関数)を一つにまとめたユーザー定義型。
カプセル化
外部から直接データを触らせず、メソッドを通して操作させることで安全性を保つ仕組み。
コンストラクタ
オブジェクトが生成されるときに自動的に呼ばれる初期化用の関数。
デストラクタ
オブジェクトが破棄されるときに自動的に呼ばれる後始末用の関数。
メンバ初期化子リスト
コンストラクタの引数リストの後ろに : で記述する、メンバ変数を初期化するための構文。

詳細解説

銀行口座 (Bank Account)

クラスは「銀行口座」のようなものです。 口座残高(データ)を誰でも自由に書き換えられたら困りますよね? だから残高は隠しておきます(private)。 代わりに「預金する」「引き出す」という窓口(publicメソッド)を用意します。この窓口を通せば、「マイナスの引き出し」のような不正な操作をブロックできます。これがカプセル化です。

クラスの構成要素

  • 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など)
Defaults
// struct はデフォルトで public
struct Data {
int id; // public
std::string name; // public
};
// class はデフォルトで private
class Manager {
int id; // private
public:
void doWork();
};

実践テクニック

メンバ初期化子リストを使う

コンストラクタの中身で代入するのではなく、初期化リスト(: の後ろ)を使うのがC++の流儀です。特に `const` メンバや参照メンバは、初期化リストでしか初期化できません。

Initializer List
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 メソッドの意味(メンバを変更しない)を理解している

参考リンク