クラスの宣言
ここでは、自分で新たにクラスを作る方法を紹介します。
以下のように宣言することでクラスを定義できます。
class 【クラス名】 { 【メンバ変数】 … 【メンバ関数】 … };
特に難しいことはありません。
クラス名を決め、そのクラス内にあるメンバ変数とメンバ関数を書き並べるだけです。
ここでは例としてxy座標とそれを操作するCoordinateクラスを作りましょう。
coordinate_sample1.cpp
class Coordinate { //メンバ変数 int x; int y; //メンバ関数 int showData(); double getDistance(); };
xy座標の値を示すx、yをメンバ変数として持ち、メンバ関数は座標のデータを表示する関数と原点からの距離を返す関数を用意しました。
メンバ関数の定義はクラスの宣言内にそのまま書いても良いのですが、読みにくくなるので長いものは宣言の外に書くのが一般的です。
【戻り値の型】 【クラス名】::【メンバ関数名】(【引数】) { 【処理】 }
メンバ関数であることを明示するために関数名の前にクラス名を記述します。
実例を見てみましょう。
coordinate_sample2.cpp
int Coordinate::showData() { std::cout << "(" << x << ", " << y << ")" << std::endl; return 0; } double Coordinate::getDistance() { return sqrt(x * x + y * y); }
ただし、sqrtは
publicとprivate
クラスの宣言ではカプセル化の概念から、メンバへのアクセスコントロールができます。
カプセル化についてはオブジェクト指向とはを参照。
ここではpublicとprivateについて説明します。
publicはデフォルトで設定されているアクセスコントロールです。
何も書かなかった場合はpublicとして扱われます。
publicに指定されているメンバはソースコード内のどこからでもアクセスすることが出来ます。
それに対してprivateに指定されているメンバはクラス内のメンバ関数からのみアクセスが出来ます。
これによってクラス外からの意図しない操作を防ぐことが出来ます。
先ほどの座標クラスをprivateを使って直してみましょう。
coordinate_sample3.cpp
class Coordinate { //メンバ変数 private: int x; int y; //メンバ関数 public: int setData(); int showData(); double getDistance(); };
メンバ変数をprivate、メンバ関数をpublicに指定しました。
指定の方法ですが「private:」と記述してから、次の指定があるまでが全てprivateになります。
publicについても同様です。
これを指定たままだとx、yの値を変えられないのでその為の関数setData()を追加しました。
全てのメンバ変数の操作をこの関数を通すことで意図しない操作を防ぎます。
サンプルコード
以下がサンプルコードです。
main()関数を用意していないので実行はできません。
クラスを呼び出す方法についてはクラスの使い方で解説します。
coordinate_sample4.cpp
#include <iostream> #include <cmath> class Coordinate { //メンバ変数 int x; int y; //メンバ関数 int setData(int X, int Y) int showData(); double getDistance(); }; int Coordinate::setData(int X, int Y) { x = X; y = Y; return 0; } int Coordinate::showData() { std::cout << "(" << x << ", " << y << ")" << std::endl; return 0; } double Coordinate::getDistance() { return sqrt(x * x + y * y); }