structとclassの比較
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/104。
C++では、structとclassはほぼ同じです。どちらもメンバー変数、メンバー関数、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 を使用します。この慣習に従うと、コードの意図が他の開発者にもより明確になります。
チャレンジ
簡単C++の規約に基づいて、structとclassの使い分けを示す、シンプルな設定システムを構築しましょう。公開して直接アクセスできる単純なデータにはstructを、カプセル化と制御されたアクセスが必要なデータにはclassを作成します。
コードを整理するために、2つのファイルを作成します。
Config.h:異なる種類の設定データを表すstructとclassをそれぞれ定義します。まず、
Dimensionsというstructを作成します。これは、幅と高さ(どちらもint)を格納する単純なデータコンテナです。structのメンバーはデフォルトでpublicなので、getterを使わずに直接アクセスできるようにします。幅と高さの積を返すarea()メソッドも含めます。次に、適切なカプセル化によってアプリケーション設定を管理する
AppConfigというclassを作成します。アプリ名(string)と、ウィンドウサイズを表すDimensionsオブジェクトを格納します。classのメンバーはデフォルトでprivateなので、publicインターフェースを明示的にアクセス可能にする必要があります。以下を用意します。- アプリ名、幅、高さを受け取るコンストラクター
- 名前を返すgetter
getAppName() Dimensionsを返すgettergetWindowSize()- 次の内容を出力するメソッド
displayConfig():"App: <name>, Window: <width>x<height>, Area: <area>"
main.cpp:structとclassの使用方法の違いを示します。入力からアプリ名、幅、高さを読み込み(3つの ayrıな行)、その後、次の処理を行います。- 幅と高さの値を使って
Dimensionsstructを直接作成し、そのメンバーに直接アクセスして次の内容を出力する:"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;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ