Menu
Coddy logo textTech

structとclassの比較

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/104。

C++では、structclassはほぼ同じです。どちらもメンバー変数、メンバー関数、constructorを持つことができ、inheritanceをサポートします。唯一の違いは、デフォルトのアクセスレベルです。

class では、メンバーはデフォルトで privateです。struct では、メンバーはデフォルトで publicです。

struct Point {
    int x;    // デフォルトで public
    int y;    // デフォルトで public
};

class Circle {
    double radius;    // デフォルトで private
    
public:
    double getRadius() { return radius; }
};

これは inheritance にも当てはまります。struct はデフォルトで public に継承し、class は private に継承します。

struct DerivedStruct : Base {};    // 公開継承
class DerivedClass : Base {};      // 非公開継承

これらのデフォルト以外に、技術的な違いはありません。ただし、慣例は重要です。

ほとんどの C++ プログラマーは、パブリックメンバーを持つ単純なデータコンテナー(座標や設定など)には struct を使用し、カプセル化と振る舞いが重要な場合には class を使用します。この慣習に従うと、コードの意図が他の開発者にもより明確になります。

challenge icon

チャレンジ

簡単

C++の規約に基づいて、structclassの使い分けを示す、シンプルな設定システムを構築しましょう。公開して直接アクセスできる単純なデータにはstructを、カプセル化と制御されたアクセスが必要なデータにはclassを作成します。

コードを整理するために、2つのファイルを作成します。

  • Config.h:異なる種類の設定データを表すstructとclassをそれぞれ定義します。

    まず、Dimensionsというstructを作成します。これは、幅と高さ(どちらもint)を格納する単純なデータコンテナです。structのメンバーはデフォルトでpublicなので、getterを使わずに直接アクセスできるようにします。幅と高さの積を返すarea()メソッドも含めます。

    次に、適切なカプセル化によってアプリケーション設定を管理するAppConfigというclassを作成します。アプリ名(string)と、ウィンドウサイズを表すDimensionsオブジェクトを格納します。classのメンバーはデフォルトでprivateなので、publicインターフェースを明示的にアクセス可能にする必要があります。以下を用意します。

    • アプリ名、幅、高さを受け取るコンストラクター
    • 名前を返すgetter getAppName()
    • Dimensionsを返すgetter getWindowSize()
    • 次の内容を出力するメソッドdisplayConfig()"App: <name>, Window: <width>x<height>, Area: <area>"
  • main.cpp:structとclassの使用方法の違いを示します。入力からアプリ名、幅、高さを読み込み(3つの ayrıな行)、その後、次の処理を行います。
    • 幅と高さの値を使ってDimensions structを直接作成し、そのメンバーに直接アクセスして次の内容を出力する:"Direct struct access: <width> x <height>"
    • 3つすべての値を使ってAppConfigオブジェクトを作成する
    • displayConfig()を呼び出して完全な設定を表示する
    • getterを使ってウィンドウの寸法を取得し、次の内容を出力する:"Via getter - Area: <area>"

このチャレンジでは、単純で透明性の高いデータ(座標や寸法など)にはstructを使い、アクセスを制御してデータに関連する振る舞いを追加したい場合にはclassを使うという規約を説明します。

std::stoi()を使って、幅と高さの入力を文字列から整数に変換します。ヘッダーファイルにインクルードガードを記述することも忘れないでください。

自分で試してみよう

#include <iostream>
#include <string>
#include "Config.h"

using namespace std;

int main() {
    // 入力を読み取る
    string appName;
    string widthStr;
    string heightStr;
    
    getline(cin, appName);
    getline(cin, widthStr);
    getline(cin, heightStr);
    
    int width = stoi(widthStr);
    int height = stoi(heightStr);
    
    // TODO: width と height を持つ Dimensions 構造体を作成する
    // Access its members directly to print: "Direct struct access: <width> x <height>"
    
    // TODO: appName、width、height を持つ AppConfig オブジェクトを作成する
    
    // TODO: AppConfig オブジェクトで displayConfig() を呼び出す
    
    // TODO: Use getWindowSize() getter to get dimensions and print: "Via getter - Area: <area>"
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ