C++ の基本はクラスにあります。 クラスとは、C 言語の構造体とよく似ていますが、 メンバとして変数の他に関数ももつことができます。
たとえば、RGB カラーを表す Color クラスを考えてみましょう。
class Color
{
public:
UInt08 r; // R 要素
UInt08 g; // G 要素
UInt08 b; // B 要素
};
このように宣言された Color クラスは、 C 言語の構造体とまったく同じように扱うことができます。
Color color; color.r = 255; color.g = 0; color.b = 0;
C 言語の構造体と同じように、変数を宣言することでクラスを使用できます。 (ただし変数の宣言に struct キーワードや class キーワードは不要です。) 上記コードの color 変数のような Color クラス型の値のことをオブジェクトまたはインスタンスといいます。 「color 変数の値は Color クラスのオブジェクトである」 という言い方をします。
r, g, b は Color クラスのメンバ変数ですが、 クラスにはメンバ関数 (メソッド) を宣言することもできます。 Color クラスに明度を返す関数を宣言してみましょう。 (RGB カラーの明度は、各要素の値の最大値として定義されます。)
class Color
{
public:
UInt08 r; // R 要素
UInt08 g; // G 要素
UInt08 b; // B 要素
UInt08 Brightness()
{
return MAX(r, MAX(g, b));
}
};
ここでは Color クラスの宣言の中に Brightness() メンバ関数の定義も書きました。 このような定義の仕方をインライン定義といいます。
メンバ関数の宣言と定義を分離することもできます。 これを非インライン定義といいます。
class Color
{
public:
UInt08 r; // R 要素
UInt08 g; // G 要素
UInt08 b; // B 要素
UInt08 Brightness();
};
UInt08 Color::Brightness()
{
return MAX(r, MAX(g, b));
}
関数定義の書き方は C 言語の場合とほとんど同じです。 メンバ関数の宣言と定義を分離する場合、 「クラス名+"::"+メンバ関数名」という関数名で定義します。
メンバ関数は次のように使います。
Color color; // Color クラスのオブジェクトを作成 color.r = 128; color.g = 200; color.b = 64; UInt08 bri = color.Brightness(); // 明度を計算する
このように、「オブジェクト+"."+メンバ関数」という記述により、 オブジェクトのメンバ関数を呼び出すことができます。 これで color オブジェクトの r, g, b メンバ変数の最大値が返されます。
次のようなコードを実行してみましょう!
どのような結果になるでしょうか?
Color クラスに何か別のメンバ関数を定義してみましょう。
Void TestClass(Void)
{
Color color;
color.r = 64;
color.g = 96;
color.b = 32;
UInt08 bri = color.Brightness();
DBGPRINTF("Brightness = %d", bri);
}