この記事を見ている方は、「オブジェクト指向について勉強したけど、C言語の構造体の違いが分からない」と悩んでいる方だと思います。
この記事では、オブジェクト指向と構造体の違いについて初心者にも分かりやすいように解説します!
以下の記事では、AWSを無料で勉強する方法をまとめているので、あわせて参考にしてください。
上記の記事でも紹介していますが、侍テラコヤでは解説動画が無料で視聴できるので、こちらも見てみるといいですよ!
結論:C言語でオブジェクト指向を実装するなら構造体を使う
最初に結論を書きますが、両者は違いがあるというよりも、「C言語でオブジェクト指向(ぽいもの)を実装するなら構造体を使う」といった感じです。
つまり、「構造体」は「オブジェクト指向」の手段の1つということになります。
構造体に対応するのはオブジェクト指向でいえば「クラス」という概念の方が近いです。
なので今回は、クラスと構造体の違いについて説明していきます。
ちなみに、C言語でオブジェクト指向を実装する方法は以下の記事でも解説していますので、あわせて参考にしてください。
構造体とクラスの違い
構造体とクラスの違いを説明するにあたって、まずはそれぞれの意味を説明します。
ちなみに先に結論を書くと、「C言語においてはクラス=構造体」だと思って下さい。
クラスとは
まずは簡単にクラスについて説明します。
クラスとは、「まとまりのある変数や機能(関数)を 1つにまとめた型」です。
そして、クラスに属する変数を「属性」、関数を「メソッド」と呼びます。
例えば、犬を表すDogクラスというクラスがあれば、その属性として、犬の「名前」や「年齢」、「犬種」を表すものが考えられます。
また、メソッドとしては「吠える」、「鳴く」といったものがあるかもしれません。
そして、クラスをもとに作られる実際の変数をオブジェクト、またはインスタンスと呼びます。
クラスの時点ではまだ実体ではなく、あくまで型のようなもので、例えばDogクラスをもとにインスタンス「ポチ」や「ゴン」を作るような感じです。
インスタンス「ポチ」の属性は、名前がポチで、年齢は5歳、犬種はチワワとします。
メソッド「吠える」は「きゃん!」、「鳴く」は「くぅ〜ん」などとしましょう。
一方で、インスタンス「ゴン」は名前がゴン、年齢は8歳、犬種はブルドッグ、「吠える」は「がう!」で「鳴く」は「ばう!」かもしれません。
このように、同じ型(クラス)から、いくつも別のインスタンスを作れます。
構造体とは
続いて構造体について説明します。
構造体は、「まとまりのある変数を1つにまとめた型」です。
構造体に属する変数のことを「メンバ変数」といいます。
先ほどのDogクラスを構造体で表現するのであれば、構造体型「struct Dog」を定義し、メンバ変数として名前や年齢、犬種を設定すればよいです。
メソッドに関しては、C言語の構造体では関数ポインタを使うなど少し応用的になりますので、ここではクラスの属性にあたるメンバ変数のみ定義した例を載せておきます。
struct Dog {
char name[10];
int age;
char bread[10];
}
このstruct Dog型の変数が、オブジェクト指向でいうオブジェクト(インスタンス)に相当します。
/* インスタンス:ポチの作成*/
struct Dog Pochi = {"ポチ", 5, "チワワ"};
クラスと構造体の違いとは
以上を踏まえて、クラスと構造体の共通点は
クラスも構造体も、「そこから作成される実体のテンプレート」
です。
テンプレート(クラスまたは構造体)をもとに、実際のオブジェクト(その構造体型の変数)を作成します。
一方で違う点は、
クラスは関数も持つことができるが、構造体は変数だけ
という点です。
構造体でメソッドを定義することはできないのか
では、構造体ではクラスのように関数をメンバにすることができないのか、と諦めるしかないのでしょうか?
実は、構造体でも関数をメンバにする方法はあります!
それは、「関数ポインタ」を使うことです。(正確には関数へのポインタ)
ポインタはしょせん変数なので、メンバ変数として持つことができます。
そして、メンバ変数としてポインタの宛先を関数にすれば、あたかも構造体に関数を持たせて、クラスでいうメソッドを実装したようにみせることができます。
ただ、関数ポインタは難しいと感じる人も多いと思うので、メンバ変数としてどうやって使うかは、以下の記事で紹介しています。
まとめ
今回は、「オブジェクト」と「構造体」の違いについて説明しました。
以下のようにまとめることができます。
- C言語の構造体は、オブジェクト指向でいう「クラス」を実現するための手段
- クラスから生成されるオブジェクト(インスタンス)は、C言語では構造体型の変数
- クラスは属性として関数を定義できる(メソッド)が、構造体でメソッドを再現するには関数ポインタを使用する必要がある
C言語ではオブジェクト指向がサポートされていないため、オブジェクト指向プログラミングをやるにはいろいろと工夫が必要です。
ただ、工夫さえすれば、C言語でもオブジェクト指向プログラミングぽいことは可能なので、ぜひチャレンジしてみてください!
以下の記事では、AWSを無料で勉強する方法をまとめているので、あわせて参考にしてください。
上記の記事でも紹介していますが、侍テラコヤでは解説動画が無料で視聴できるので、こちらも見てみるといいですよ!
コメント