C++ のクラスの構造体
同様のデータ型のグループを格納する必要がある場合は常に配列を使用します。ただし、類似していないタイプのデータのグループを格納する必要がある状況が発生した場合は、構造体とクラスのデータ型を使用します。
この記事では、構造体とクラス、およびクラス内で構造体を使用する方法について説明します。
C++ のクラスの構造体
構造体は、類似していないタイプのデータを格納するために使用されるユーザー定義のデータ型です。キーワード struct
はそれを宣言します。
一方、クラスは、類似していないタイプのデータを格納するためのユーザー定義のデータ型でもあります。キーワード class
はそれを示します。
ただし、これらの主な違いは、クラスがそのメンバーの実装の詳細を非表示にし、デフォルトでクラスのすべてのメンバーをプライベートにするのに対し、構造体はメンバの実装の詳細を隠蔽せず、デフォルトですべてのメンバをパブリックとしていることです。
ここで、C++ で構造体とクラスを個別に使用する方法を理解しましょう。
C++ の構造体
struct
キーワードを使用して C++ で構造体を宣言し、続いてそのすべてのデータメンバーを宣言します。それをよりよく理解するためにコード例を見てみましょう。
#include <iostream>
using namespace std;
struct X {
int a;
};
int main() {
X x;
x.a = 10;
cout << x.a;
}
出力:
10
上記のコード例では、構造体 X
を宣言し、その中で変数 a
を宣言します。ここで、この構造体のインスタンスを作成してから、main メソッドのこのインスタンス x
によって変数 a
にアクセスしようとします。デフォルトではすべてのメンバーがパブリックであるため、構造体は簡単にアクセスして値を変更できます。
C++ のクラス
C++ で class
キーワードを使用してクラスを宣言し、続いてクラスのデータメンバーを宣言します。コードを使用して、C++ でのクラスの使用法を理解しましょう。
#include <iostream>
using namespace std;
class X {
int a;
};
int main() {
X x;
x.a = 10;
cout << x.a;
}
出力:
./ex.cpp: In function 'int main)':
./ex.cpp:23:9: error: 'int X::a' is private
int a;
^
./ex.cpp:28:7: error: within this context
x.a = 10;
^
./ex.cpp:23:9: error: 'int X::a' is private
int a;
^
./ex.cpp:29:13: error: within this context
cout<<x.a;
^
上記のコード例では、クラスを作成し、その中にデータメンバーを変数 a
として宣言しています。ただし、クラスのメンバーはデフォルトでプライベートであるため、main
関数内でこのデータメンバーにアクセスすることはできません。
したがって、アクセスできず、エラーがスローされます。
C++ のクラスで Struct を使用する
構造体とクラスを個別に作成する方法を見てきました。ここで、C++ のクラス内で構造体を使用する方法を理解しましょう。
コード例を使用して、この概念を理解します。
#include <iostream>
using namespace std;
class X {
public:
struct T {
int a;
};
};
int main() {
X x;
x.a = 10;
cout << x.a;
}
出力:
./ex.cpp: In function 'int main)':
./ex.cpp:15:7: error: 'class X' has no member named 'a'
x.a = 10;
^
./ex.cpp:16:13: error: 'class X' has no member named 'a'
cout<<x.a;
^
ご覧のとおり、main メソッドで構造体変数 a
にアクセスしようとすると、上記のコードはエラーをスローします。これは、クラスのインスタンスを作成し、クラスのインスタンスによって変数を呼び出すだけだからです。
構造体のインスタンスも作成しませんでした。したがって、プログラムは変数 a
を決定しないエラーをスローします。
次に、このエラーを克服する方法について説明します。構造体とクラスの例で見たように、そのメンバーにアクセスする前に、構造体とクラスのインスタンスを作成する必要があります。
クラス内で構造体を使用する場合も同じ概念が当てはまります。コード例を使用してこれを理解しましょう。
#include <iostream>
using namespace std;
class X {
public:
struct T {
int a;
};
T t;
};
int main() {
X x;
x.t.a = 10;
cout << x.t.a;
}
出力:
10
したがって、クラス自体の内部に構造体のインスタンスを作成し、クラスと構造体のインスタンスの両方を使用して構造体変数 a
にアクセスします。
まとめ
この記事では、C++ でのクラスと構造体の使用法について説明しました。どちらもユーザー定義のデータ型です。ただし、これらの唯一の違いは、クラスのメンバーはデフォルトでプライベートであるのに対し、構造体のメンバーはデフォルトでパブリックであるということです。
その後、クラスで構造体を使用しているときに通常発生する問題についても説明しました。