独習C++

C++:8.クラスとオブジェクト指向プログラミングの導入

独習C++

プログラミングの世界では、データとそれに対する操作を適切に整理するために、オブジェクト指向プログラミング(OOP)が非常に有用です。C++はオブジェクト指向の特徴を備えた言語であり、クラスとオブジェクトの概念を理解することは、効率的で保守性の高いコードを書くために重要です。

オブジェクト指向プログラミングとは

オブジェクト指向プログラミングは、データとその操作を一つの「オブジェクト」としてまとめ、コードの再利用性と可読性を高めるプログラミング手法です。C++では、クラスを使ってオブジェクトの設計を行います。クラスは、オブジェクトを生成するための「設計図」であり、その中にデータ(メンバ変数)と操作(メンバ関数)を定義します。

クラスの基本構造

クラスは、データをカプセル化し、そのデータを操作するための関数を定義する枠組みです。以下は、C++でクラスを定義する際の基本的な構文です。

class Car {
public:
    // メンバ変数
    std::string brand;
    int year;

    // コンストラクタ
    Car(std::string b, int y) {
        brand = b;
        year = y;
    }

    // メンバ関数
    void displayInfo() {
        std::cout << "Brand: " << brand << ", Year: " << year << std::endl;
    }
};

このコードでは、`Car`というクラスを定義しています。クラスにはブランド名と製造年を保持するためのメンバ変数(`brand`と`year`)があり、それらを初期化するコンストラクタ、そして情報を表示するためのメンバ関数(`displayInfo`)が含まれています。

オブジェクトの作成と操作

クラスが定義されたら、それに基づいてオブジェクトを作成できます。以下は、`Car`クラスを使用してオブジェクトを作成し、その情報を表示する例です。

int main() {
    // オブジェクトの作成
    Car car1("Toyota", 2020);

    // メンバ関数の呼び出し
    car1.displayInfo();

    return 0;
}

上記のコードを実行すると、以下の結果が表示されます。

Brand: Toyota, Year: 2020

このように、クラスを使用すると、オブジェクトを作成してそのデータを管理・操作することができます。

クラスの詳細: アクセス修飾子とカプセル化

C++では、クラスのメンバ変数やメンバ関数のアクセス制御を行うために、アクセス修飾子が使われます。主な修飾子には`public`、`private`、および`protected`があります。

  • public: 外部からアクセス可能なメンバを定義します。
  • private: クラス内部からのみアクセス可能なメンバを定義します。
  • protected: 派生クラスからはアクセス可能だが、外部からはアクセスできないメンバを定義します。

カプセル化とは、データを外部から隠し、クラス内での操作だけを許可する概念です。これにより、コードの安全性と保守性が向上します。以下は、`private`を使用してカプセル化を行った例です。

class Car {
private:
    std::string brand;
    int year;

public:
    // コンストラクタ
    Car(std::string b, int y) {
        brand = b;
        year = y;
    }

    // メンバ関数
    void displayInfo() {
        std::cout << "Brand: " << brand << ", Year: " << year << std::endl;
    }

    // ブランドを変更するためのメンバ関数
    void setBrand(std::string b) {
        brand = b;
    }
};

この例では、`brand`と`year`は`private`で定義され、外部から直接アクセスできません。しかし、`setBrand`などの公開されたメンバ関数を通じてデータを安全に操作することができます。

クラスの拡張: 継承と多態性

C++では、既存のクラスを継承して新しいクラスを作成することができます。これにより、既存のクラスの機能を再利用し、新しいクラスに独自の機能を追加することが可能です。また、継承と多態性(ポリモーフィズム)を活用することで、柔軟で再利用性の高いプログラムを構築できます。

class ElectricCar : public Car {
private:
    int batteryLife;

public:
    // コンストラクタ
    ElectricCar(std::string b, int y, int battery) : Car(b, y), batteryLife(battery) {}

    // メンバ関数のオーバーライド
    void displayInfo() {
        Car::displayInfo();
        std::cout << "Battery Life: " << batteryLife << " hours" << std::endl;
    }
};

この例では、`Car`クラスを継承した`ElectricCar`クラスが定義されています。`ElectricCar`クラスはバッテリー寿命を保持するための`batteryLife`メンバ変数を追加し、`displayInfo`メンバ関数をオーバーライドして独自の情報を表示しています。

まとめ

クラスとオブジェクト指向プログラミングは、C++を効果的に使う上での基本的な概念です。クラスを使ってデータをカプセル化し、再利用可能なコードを作成することで、ソフトウェアの保守性と拡張性が向上します。また、継承や多態性を活用することで、より柔軟な設計が可能になります。この記事では、クラスの基本的な使い方から、オブジェクトの作成、継承に至るまでを解説しました。次回は、テンプレートとSTLについて詳しく見ていきます。

購読
通知
0 Comments
Inline Feedbacks
View all comments