Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C++における構造体(struct)とクラス(class)の違いを徹底解説

C++において、構造体(struct)クラス(class)は本質的にはほぼ同じものです。どちらもメンバ変数やメンバ関数を持つことができ、継承やコンストラクタなども利用できます。しかし、両者にはいくつかの重要な違いが存在します。この記事では、その主な違いについて具体例を交えて解説します。

違い1:デフォルトのアクセス指定子

最も大きな違いは、メンバのデフォルトのアクセスレベルです。

  • クラス:メンバはデフォルトで private(非公開)になります。
  • 構造体:メンバはデフォルトで public(公開)になります。

実際にコードを見て、この違いを確認してみましょう。

クラスの場合(コンパイルエラーになる例)

#include <iostream>
using namespace std;

class my_class {
    int x = 10;  // デフォルトでprivate
};

int main() {
    my_class my_ob;
    cout << my_ob.x;  // privateメンバへのアクセス
}

出力結果

このプログラムはコンパイルできません。
privateなデータメンバ「x」にアクセスしているため、
コンパイル時エラーが発生します。

クラスのメンバ変数 x はアクセス指定子が明示されていないため、デフォルトの private として扱われます。そのため、クラス外部から直接アクセスしようとするとコンパイルエラーとなります。

構造体の場合(正常に動作する例)

#include <iostream>
using namespace std;

struct my_struct {
    int x = 10;  // デフォルトでpublic
};

int main() {
    my_struct my_ob;
    cout << my_ob.x;
}

出力結果

10

構造体ではメンバ変数 x がデフォルトで public となるため、外部から自由にアクセスでき、問題なく値が出力されます。

違い2:継承時のデフォルトアクセス指定子

もう一つの違いは、継承を行う際のベースクラス(基底クラス)のデフォルトアクセス指定子です。

  • クラスを派生させる場合:デフォルトの継承アクセス指定子は private になります。
  • 構造体を派生させる場合:デフォルトの継承アクセス指定子は public になります。

クラスによる継承(コンパイルエラーになる例)

#include <iostream>
using namespace std;

class my_base_class {
public:
    int x = 10;
};

class my_derived_class : my_base_class {  // デフォルトでprivate継承
};

int main() {
    my_derived_class d;
    cout << d.x;
}

出力結果

このプログラムはコンパイルできません。
基底クラスの変数「x」にアクセスできないという
コンパイル時エラーが発生します。

ここでは、基底クラス側で xpublic に宣言していますが、派生クラス側で継承のアクセス指定子を省略しているため、private継承として扱われます。その結果、基底クラスの public メンバも派生クラス内では private になり、外部からアクセスできなくなります。

構造体による継承(正常に動作する例)

#include <iostream>
using namespace std;

class my_base_class {
public:
    int x = 10;
};

struct my_derived_struct : my_base_class {  // デフォルトでpublic継承
};

int main() {
    my_derived_struct d;
    cout << d.x;
}

出力結果

10

構造体での継承では、デフォルトが public継承であるため、基底クラスの public メンバがそのまま public のまま引き継がれ、外部からアクセス可能です。

まとめ

項目classstruct
メンバのデフォルトアクセスprivatepublic
継承時のデフォルトアクセスprivate継承public継承

このように、C++における struct と class の違いは「デフォルトのアクセス指定子」だけです。機能面では完全に同等であり、使い分けはコーディング規約や設計方針に依存します。一般的には、単純なデータの集約を表す場合は struct、カプセル化やオブジェクト指向的な設計を行う場合は class を使用するのが慣習となっています。

  1. C/C++のmemcpy()関数の使い方と実例解説

    この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ