2018-01-12

Cプログラマのための、
C++オブジェクト指向簡単裏口入門(3)

オブジェクト!?

これまで、散々オブジェクト指向って聞かされてきたけれど、そのオブジェクトとは何なの? という疑問をお持ちでしょうか。それは、平たく言えば「もの」となります。C++ではこれをクラスというものを使って構築&表現します。

おっと、既に話が飛躍したかも知れません。

オブジェクト指向というのは、単にプログラミング以外にも、システムの概要的な設計の段階からその考え方を適用可能なので、一概にその「もの」が実際には何であるか、とは言い切れないところがあります。しかし、この記事はC++プログラミングに限定するので、それはメモリ上のある構造を指しているに過ぎない、と言えます。

Cでは構造体に相当する、クラスというものがC++にはあります。キーワードもそのものズバリ、classです。そして、構造体を示すstructも、実はC++ではクラスなのです。違いはほとんどありません。ある意味、全く違わないとも言えます。(小さな違いについてはいずれまた)

クラスそのものはオブジェクトではありません。オブジェクトの設計図です。これをインスタンス化したものがオブジェクトです。「インスタンス化」という言葉は是非ここで覚えてしまってください。次のコードのように使用します。

コード1

// まずはクラスの定義
class MyClass
{
    int member;
};

void func()
{
    MyClass object;    // MyClassクラスをobjectという名前でインスタンス化
}
このやり方は実はCでもありましたね。Cでは構造体になりますが、そっくりなコードになります。

コード2

// 構造体の定義(C言語)
typedef struct
{
    int member;
} MyStruct;

void func()
{
    MyStruct object;  // これも実はインスタンス化
}
ちなみに、C++ではsturctもclassと同様、typedefは不要です。
是非、C++なのにstructにtypedefを使うような大人にならないでくださいね!?(何故か使う人が多い)

コード3

// 構造体の定義(C++)
struct MyStruct  // structでも実際にはクラス。構造体の上位互換性がある。
{
    int member;
};

void func()
{
    MyStruct object;
}

ここまでをまとめると、オブジェクト指向のオブジェクトの設計図がクラス、そして、そこからインスタンス化したものがオブジェクトになります。
なので、C++でオブジェクトとは、メモリ上の構造でしかない、と覚えておいてほぼ間違いはありません。

0 件のコメント:

コメントを投稿