©️

C++ クラスの定義

2024/10/02に公開

記事の概要

  • オブジェクト指向のプログラミング言語ではクラスというものを定義する
  • クラスの定義はプログラミング言語に関わらず共通の概念がある
  • この記事ではC++でのクラスの定義についてをまとめる

クラスの用語(抜粋)

一般的なクラスに関連する用語(抜粋)

  • メンバ変数(Member Variables / Fields)
    • クラス内で定義される変数
    • アクセス修飾子によって外部からのアクセス範囲を制御する
  • メンバ関数(Member Functions / Methods)
    • クラスが提供する機能や動作を定義する関数
    • メンバ変数にアクセスし、その状態を操作するための手段
    • アクセス修飾子によって外部からのアクセス範囲を制御する
  • アクセス修飾子(Access Modifiers)
    • クラスのメンバ変数やメンバ関数のアクセス範囲を制御するキーワード
      • public: どこからでもアクセス可能
      • private: クラス内部でのみアクセス可能
      • protected: 同じクラスやサブクラスからアクセス可能
  • コンストラクタ
    • オブジェクトが生成されるときに自動的に呼び出される
    • オブジェクトの初期化を行う

C++のクラスで必要な用語(抜粋)

  • スコープ演算子
    • クラスや名前空間の範囲内にあるメンバや要素にアクセスするために使用される演算子
    • メンバ関数の定義で使うダブルコロン(::)のこと
    • 小規模でシンプルなクラスの場合、クラス内でメンバ関数を定義することが一般的(ゲッターやセッターなど)
    • 大規模なクラスや複雑な処理を含む場合、コードの整理や保守性の面からメンバ関数をクラス外で定義することが一般的(ヘッダファイルにクラス宣言、ソースファイルに実装)

クラスの設計に関連する用語(抜粋)

  • 抽象化(Abstraction)
    • 必要な機能だけを外部に見せ、複雑な実装の詳細は隠す
    • ユーザがアクセスするインターフェース(メンバ関数)をつくる
  • カプセル化(Encapsulation)
    • メンバ変数をクラス内に隠蔽し、外部から直接アクセスされないようにする
    • アクセス修飾子を使い、アクセスを制限する
    • メンバ関数を介して、メンバ変数にアクセス・変更することで、データの整合性を保つ

サンプルコード

#include <iostream>
#include <string>

class Person {
private:
    std::string name;
    int age;

public:
    // コンストラクタ(オブジェクト生成時に呼ばれる)
    Person(std::string personName, int personAge) {
        name = personName;
        age = personAge;
    }

    // メンバ関数の宣言
    void introduce() const;

    // アクセッサ(getter)
    std::string getName() const {
        return name;
    }

    // ミューテータ(setter)
    void setName(std::string newName) {
        name = newName;
    }

    // 年齢を取得するためのアクセッサ(getter)
    int getAge() const {
        return age;
    }

    // 年齢を設定するためのミューテータ(setter)
    void setAge(int newAge) {
        age = newAge;
    }
};

// クラス外でメンバ関数の定義(スコープ演算子)
void Person::introduce() const {
    std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;
}

int main() {
    // Personオブジェクトの作成
    Person person1("Alice", 25);

    // メンバ関数を呼び出して、自己紹介を出力
    person1.introduce();

    // 名前と年齢の変更
    person1.setName("Bob");
    person1.setAge(30);

    // 変更後の情報を出力
    std::cout << "Updated info: " << person1.getName() << ", " << person1.getAge() << " years old." << std::endl;

    return 0;
}

実行結果

Hello, my name is Alice and I am 25 years old.
Updated info: Bob, 30 years old.

Discussion