C++の基礎 : クラス
クラス
クラスは構造体と似ている
C++ の基本はクラスにあります。クラスとは、C 言語の構造体とよく似ていますが、メンバとして変数の他に関数ももつことができます。
【Java では】Java では、メンバ変数のことをフィールドと呼び、メンバ関数のことをメソッドと呼んでいます。
たとえば、RGB カラーを表す Color クラスを作ってみましょう。
class Color { public: UInt08 r; // R 要素 UInt08 はSophiaFramework UNIVERSEで定義されている UInt08 g; // G 要素 言葉で、意味は unsigned char と同じです。 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 クラスのメンバ変数です。C++ のクラスでは、これらの r, g, b の値を操作する関数というものを「クラスの中に」定義できます。このように、クラスのメンバ変数を操作する関数を、メンバ関数 (メソッド) と呼びます。
それでは、メンバ関数 Color クラスのそれぞれの要素に同じ値を足す関数 Add() を宣言してみましょう。
class Color { public: UInt08 r; // R 要素 UInt08 g; // G 要素 UInt08 b; // B 要素 Void Add(UInt08 n) { r += n; g += n; b += n; } };
これは次のように使います。
Color c1; c1.r = 30; c2.g = 60; c3.b = 105; c1.Add(10); // それぞれの要素に10足される
このように、「オブジェクト+"."+メンバ関数」という記述により、オブジェクトのメンバ関数を呼び出すことができます。これで c1 オブジェクトの r, g, b メンバ変数にそれぞれ10足されます。
メンバ関数として、値を返す関数を作ることもできます。明度を返す関数を宣言してみましょう (RGB カラーの明度は、各要素の値の最大値として定義されます)。
class Color { public: UInt08 r; // R 要素 UInt08 g; // G 要素 UInt08 b; // B 要素 UInt08 Brightness() { return MAX(r, MAX(g, b)); } };
使い方は次のとおりです。
Color color; // Color クラスのオブジェクトを作成 color.r = 128; color.g = 200; color.b = 64; UInt08 bri = color.Brightness(); // 明度を計算する
インライン定義と非インライン定義
ここでは 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 言語の場合とほとんど同じです。メンバ関数の宣言と定義を分離する場合、「クラス名+"::"+メンバ関数名」という関数名で定義します。
【Java では】Java では、メンバ関数を常にインライン定義で記述します。C++ では非インラインで記述するのが一般的です。
この章のまとめ
- クラスは構造体と似ています。
- クラスにはメンバ変数の他にメンバ関数ももつことができます。
- メンバ関数は宣言と同時に定義することができます。
- メンバ関数は宣言と定義を分離することもできます。この場合の関数名は「クラス名+"::"+メンバ関数名」となります。
- メンバ関数の定義は C 言語の関数の定義とほとんど同じです。
- メンバ関数を呼び出すには、「オブジェクト+"."+メンバ関数」という記法を使います。
やってみよう
次のようなコードを実行してみましょう! どのような結果になるでしょうか? Color クラスに何か別のメンバ関数を定義してみましょう。
Void TestClass(Void) { Color color; color.r = 64; color.g = 96; color.b = 32; UInt08 bri = color.Brightness(); SFXHelper::dbgprintf("Brightness = %d", bri); }