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」にアクセスできないという コンパイル時エラーが発生します。
ここでは、基底クラス側で x を public に宣言していますが、派生クラス側で継承のアクセス指定子を省略しているため、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 のまま引き継がれ、外部からアクセス可能です。
まとめ
| 項目 | class | struct |
|---|---|---|
| メンバのデフォルトアクセス | private | public |
| 継承時のデフォルトアクセス | private継承 | public継承 |
このように、C++における struct と class の違いは「デフォルトのアクセス指定子」だけです。機能面では完全に同等であり、使い分けはコーディング規約や設計方針に依存します。一般的には、単純なデータの集約を表す場合は struct、カプセル化やオブジェクト指向的な設計を行う場合は class を使用するのが慣習となっています。
-
C/C++のmemcpy()関数の使い方と実例解説
この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。 memcpy()とは? memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。 関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそ
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ