C++におけるクラスのカプセル化手法

カプセル化の目的

カプセル化により、データと操作をまとめ、以下の利点を実現する:

  • 利用の簡便化と情報隠蔽
  • データ保護と安全性向上

カプセル化キーワード

structで定義したクラスはデフォルトでpublic、classで定義したクラスはデフォルトでprivateアクセスとなる。いずれもprivate/publicで明示的にアクセス制御可能。

クラスメンバの構成

クラスはデータメンバとメソッドメンバで構成される。データメンバは通常privateとし、メソッドはインターフェース(public)と内部実装(private)に分類する。

特殊メンバ関数

  • コンストラクタ:クラス名と同名、オーバーロード可能
    • デフォルトコンストラクタ(引数なし)
    • コピーコンストラクタ(自クラスの参照を引数)
    • 変換コンストラクタ(単一引数、explicitで暗黙変換抑制)
  • デストラクタ:~クラス名、オーバーロード不可
  • 通常メンバ関数

実装例

// employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H

class Employee {
public:
    Employee(const char* emp_name, int emp_id);
    Employee(const char* emp_name);
    Employee();
    ~Employee();
    void showInfo() const;

private:
    char* name;
    int id;
};

#endif
// employee.cpp
#include <iostream>
#include <cstring>
#include "employee.h"

Employee::Employee(const char* emp_name, int emp_id) 
    : id(emp_id) {
    name = new char[strlen(emp_name) + 1];
    strcpy(name, emp_name);
}

Employee::Employee(const char* emp_name) : id(0) {
    name = new char[strlen(emp_name) + 1];
    strcpy(name, emp_name);
}

Employee::Employee() : id(1) {
    name = new char[strlen("Anonymous") + 1];
    strcpy(name, "Anonymous");
}

Employee::~Employee() {
    delete[] name;
}

void Employee::showInfo() const {
    std::cout << "ID: " << id << "\nName: " << name << std::endl;
}
// main.cpp
#include <iostream>
#include "employee.h"

int main() {
    Employee emp1;
    emp1.showInfo();

    Employee* emp2 = new Employee("Taro Yamada", 1001);
    emp2->showInfo();
    delete emp2;

    return 0;
}

メモリ管理の注意点

ヒープ領域に確保したオブジェクトは明示的にdeleteする必要がある。オブジェクト配列作成時はデフォルトコンストラクタが呼ばれるため、必ず実装が必要。

const修飾子の活用

  • constメンバ関数:オブジェクト状態変更をコンパイル時検出
  • constメンバ変数:コンストラクタ初期化リストでのみ設定可能

staticメンバ

  • staticメンバ変数:全オブジェクトで共有、クラス外で初期化
  • staticメンバ関数:オブジェクト非依存、非staticメンバ直接アクセス不可

タグ: C++ コンストラクタ デストラクタ アクセス修飾子 メモリ管理

7月14日 18:05 投稿