C++ 発展編 2日目

クラスの詳細について説明をしていきます

thisポインタ

thisポインタとは、クラスのメンバ関数内で暗黙的に利用できるポインタのことです
常にそのメンバ関数が呼び出されたオブジェクト自身のアドレスを指しています
メンバ変数とローカル変数が同名の場合などに、メンバ変数を明示的に指すために使用されます

以下にサンプルプログラムを示します

#include <iostream>
#include <string>

class MyClass {
public:
    std::string name;

    MyClass(std::string name) {
        this->name = name; // this->name はメンバ変数、name はコンストラクタの引数
    }

    void printName() const {
        std::cout << "Name: " << this->name << std::endl;
    }

    MyClass& setName(std::string newName) {
        this->name = newName;
        return *this; // オブジェクト自身への参照を返すことでメソッドチェーンが可能になる
    }
};

int main() {
    MyClass obj1("Alice");
    obj1.printName(); // 出力: Name: Alice

    MyClass obj2("Bob");
    obj2.setName("Robert").printName(); // メソッドチェーン: setName() の後に printName() を呼び出す
                                       // 出力: Name: Robert

    return 0;
}
    MyClass(std::string name) {
        this->name = name; // this->name はメンバ変数、name はコンストラクタの引数
    }

MyClassの仮引数とメンバ変数の名前が同じである場合、thisポインタを経由することで、曖昧になるメンバ変数にアクセスすることができます

constメンバ関数

constメンバ関数は、メンバ関数の宣言の末尾に const を付加することで定義します
メンバ関数の宣言の末尾に constを付加したconstメンバ関数内では、そのオブジェクトのメンバ変数を変更することができません
同時に、constメンバ関数の内部において、非constメンバ関数を呼び出すこともできません
オブジェクトの状態を読み取るだけで変更しない操作を提供するのに適しています

サンプルプログラムを以下に示します

#include <iostream>

class Counter {
private:
    int count;

public:
    Counter(int initialCount = 0) : count(initialCount) {}

    int getCount() const {
        return count; // メンバ変数を読み取るだけで変更しないため const
    }

    // void increment() const { // エラー!constメンバ関数内ではメンバ変数を変更できない
    //     count++;
    // }

    void increment() {
        count++; // 非constメンバ関数なのでメンバ変数を変更できる
    }
};

int main() {
    Counter c1;
    std::cout << "Initial count: " << c1.getCount() << std::endl; // 出力: Initial count: 0
    c1.increment();
    std::cout << "Count after increment: " << c1.getCount() << std::endl; // 出力: Count after increment: 1

    const Counter c2(5);
    std::cout << "Const object count: " << c2.getCount() << std::endl; // constオブジェクトから constメンバ関数を呼び出すのはOK
    // c2.increment(); // エラー!constオブジェクトからは非constメンバ関数を呼び出せない

    return 0;
}

※constオブジェクトとは、オブジェクトの宣言時にconstキーワードを使用して定義したオブジェクトで、その状態を変更できないオブジェクトのことです

静的クラスメンバ(静的メンバ変数、静的メンバ関数)

静的クラスメンバとは、クラスメンバの一種ですが、特定のオブジェクトと結びつかないメンバ変数やメンバ関数のことで、宣言時にstatic修飾子をつけます

静的メンバ変数

クラスのすべてのオブジェクトで共有される変数です
クラスに属し、個々のオブジェクトに属するわけではありません
クラスのスコープ内、通常はクラス定義の外、で一度だけ初期化する必要があります
オブジェクトを作成しなくてもクラス名::静的メンバ変数名と記述してアクセスすることができます
クラス全体の共通の状態やカウンタなどを管理するのに便利です

静的メンバ関数

クラスに属する関数であり、特定のオブジェクトに関連付けられていません  
thisポインタを持つことができません
特定のオブジェクトが存在しない可能性があるため、非静的なメンバ変数に直接アクセスすることはできません
静的なメンバ変数や、引数として渡されたオブジェクトのメンバにはアクセスできます
オブジェクトを作成しなくてもクラス名::静的メンバ関数名()として呼び出すことができます
クラス全体のユーティリティ関数や、静的メンバ変数を操作する関数として使用されます

以下に静的メンバを使用したサンプルプログラムを示します

#include <iostream>

class MyClass {
public:
    static int objectCount; // 静的メンバ変数の宣言

    MyClass() {
        objectCount++;
        std::cout << "Object created. Total objects: " << objectCount << std::endl;
    }

    ~MyClass() {
        objectCount--;
        std::cout << "Object destroyed. Total objects: " << objectCount << std::endl;
    }

    static int getObjectCount() { // 静的メンバ関数の宣言
        return objectCount;
    }
};

int MyClass::objectCount = 0; // 静的メンバ変数の定義と初期化 (クラス定義の外で行う)

int main() {
    std::cout << "Initial object count: " << MyClass::getObjectCount() << std::endl; // オブジェクト作成前にアクセス
    // 出力: Initial object count: 0

    MyClass obj1; // オブジェクト作成時
    // 出力: Object created. Total objects: 1

    MyClass obj2; // オブジェクト作成時
    // 出力: Object created. Total objects: 2

    std::cout << "Current object count: " << MyClass::objectCount << std::endl; // オブジェクトを介してアクセス
    // 出力: Current object count: 2

    {
        MyClass obj3; // スコープ内でのオブジェクト作成
        // 出力: Object created. Total objects: 3
    } // obj3 はここで破棄
    // 出力: Object destroyed. Total objects: 2

    std::cout << "Final object count: " << MyClass::getObjectCount() << std::endl; // オブジェクト破棄後にアクセス
    // 出力: Final object count: 2

    return 0;
}

コメント

この記事へのコメントはありません。

関連記事

C++ 5日目:変数の定義と初期化

C++ 基礎編 3日目

Python(応用編)演習問題

PAGE TOP