工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++クラスとオブジェクト:コード例付き実践ガイド

クラスとは

C++クラスは、データとそのデータを操作する関数を1つのエンティティにまとめたユーザー定義データ型です。これを設計図と考えるとわかりやすいでしょう:そこから作成されるオブジェクトの形と振る舞いを定義します。

家の設計図がドア、窓、部屋の配置を指定するのと同様に、クラスはデータメンバの配置とそれらを操作する操作を記述します。同じ設計図から複数の家(オブジェクト)を建てられます。

クラスという設計図から複数のオブジェクトが生成されるイメージ

上図では、単一のプロトタイプから異なる特徴を持つ2つの家が生成されています。

このチュートリアルで学ぶ内容:

  • クラスとは何か、C++での重要性
  • 具体的なクラス例
  • privateとpublicアクセス修飾子の役割
  • オブジェクトの作成(インスタンス化)
  • データメンバへの安全なアクセス
  • クラス内部/外部でのメンバ関数定義
  • コンストラクタとデストラクタの動作

クラス宣言

クラス宣言は簡単です:classキーワードに続けてクラス名を書き、中括弧で本体を囲みます。

構文

class className {
    // data members
    // member functions
};
  • className – クラスの識別子
  • データメンバは通常変数として宣言
  • メンバ関数が振る舞いを提供

アクセス修飾子:private vs public

アクセス修飾子はクラスメンバの可視性を制御します。

  • private – メンバはクラス内部またはフレンドからのみアクセス可能
  • public – オブジェクトが可視な場所からどこでもアクセス可能

オブジェクトの作成(インスタンス化)

オブジェクトはクラスのインスタンスです。オブジェクト宣言は変数宣言と同じパターンに従います:className objectName;

構文

className objectName;
  • className – オブジェクトを作成するクラス
  • objectName – 新しいオブジェクトの識別子

インスタンス化によりオブジェクトのメモリが割り当てられ、コンストラクタが呼ばれることがあります。

データメンバへのアクセス

publicデータメンバはドット(.)演算子でアクセスします。

例

#include <iostream>
using namespace std;
class Phone {
public:
    double cost;
    int slots;
};
int main() {
    Phone Y6;
    Phone Y7;
    Y6.cost = 100.0;
    Y6.slots = 2;
    Y7.cost = 200.0;
    Y7.slots = 2;
    cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
    cout << "Cost of Huawei Y7 : " << Y7.cost << endl;
    cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
    cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;
    return 0;
}

出力:

publicメンバへの直接アクセス例

ゲッター/セッターを使う理由

データへの直接アクセスや変更はカプセル化を破る可能性があります。ゲッターとセッターメンバ関数を使うと制御されたアクセスが可能になります。

カプセル化の例

#include <iostream>
using namespace std;
class ClassA {
public:
    void setA(int val);
    int getA() const;
private:
    int a;
};
int ClassA::getA() const {
    return a;
}
void ClassA::setA(int val) {
    a = val;
}
int main() {
    ClassA obj;
    obj.setA(20);
    cout << "Value of a is: " << obj.getA();
    return 0;
}

出力:

ゲッター/セッター経由でのアクセス結果

protectedメンバと継承

protectedメンバはクラス内部と派生クラスからアクセス可能で、制御された継承を可能にします。

例

#include <iostream>
using namespace std;
class ParentClass {
protected:
    int value;
};
class ChildClass : public ParentClass {
public:
    void setId(int x) {
        value = x;
    }
    void displayValue() {
        cout << "Value is: " << value << endl;
    }
};
int main() {
    ChildClass c;
    c.setId(21);
    c.displayValue();
    return 0;
}

出力:

protectedメンバを継承で活用する例

クラス内部 vs 外部でのメンバ関数定義

メンバ関数はクラス内部でインライン定義するか、クラス内で宣言して後からスコープ解決演算子::で定義できます。

例

#include <iostream>
#include <string>
using namespace std;
class Guru99 {
public:
    string tutorial_name;
    int id;
    void printName();
    void printId() {
        cout << "Tutorial id is: " << id;
    }
};
void Guru99::printName() {
    cout << "Tutorial name is: " << tutorial_name;
}
int main() {
    Guru99 guru;
    guru.tutorial_name = 'C++';
    guru.id = 1001;
    guru.printName();
    cout << endl;
    guru.printId();
    return 0;
}

出力:

クラス外部定義メンバ関数の実行結果

コンストラクタとデストラクタ

コンストラクタはオブジェクト作成時に初期化し、デストラクタはオブジェクト破棄直前にクリーンアップを行います。

例

#include <iostream>
using namespace std;
class ClassA {
public:
    ClassA() {
        cout << "Class constructor called" << endl;
    }
    ~ClassA() {
        cout << "Class destructor called" << endl;
    }
};
int main() {
    ClassA a; // コンストラクタ呼ばれる
    int p = 1;
    if (p) {
        ClassA b; // コンストラクタ呼ばれ、ブロック終了でデストラクタ呼ばれる
    } // 'a'のデストラクタはここで呼ばれる
    return 0;
}

出力:

コンストラクタ/デストラクタ呼び出し順序の出力

重要なポイント

  • C++は根本的にオブジェクト指向;クラスが構成要素
  • クラスはデータと関連関数をグループ化し、再利用可能な設計図を作る
  • public、private、protectedでカプセル化を強制
  • クラス名に続けてオブジェクト名でインスタンス化
  • publicメンバはドット演算子でアクセス;privateデータにはゲッター/セッターを使用
  • メンバ関数はインライン定義かクラス外部で::で定義可能
  • コンストラクタで初期化、デストラクタでクリーンアップ

C言語

  1. C# クラスとオブジェクト:堅牢な OOP の基礎
  2. C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
  3. C++フレンド関数とフレンドクラス:アクセス制御のマスター
  4. C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
  5. C++演算子を徹底解説:種類、例、サンプルプログラム付き
  6. C++ switch文をマスター:構文、使い方、実践例
  7. C++動的配列の確保をマスター:コード例付き実践ガイド
  8. C++構造体を実例で徹底解説
  9. C++のstd::listをマスターする:構文、関数、実践例
  10. C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス
  11. C#抽象クラス実践チュートリアル:コード例で理解する設計パターン