クラスとは
例えば、C言語で2次元のベクトルを利用したい場合
- x座標とy座標を記憶するための変数
- 加算や減算の関数定義
- (x, y)という形で出力するための関数
といろいろと用意する必要がありますが、C++ではクラスを利用すれば効率よく実装できます。
基本構成
記述方法
基本的には以下のような形で記述します。
class クラス名{
変数や関数などの宣言
};
メンバ変数
- 例えば、2次元ベクトルのクラスVector2を作成する場合はx座標とy座標を保存するための変数が必要。
- このような変数をメンバ変数といい、以下の様に定義しますその場合はクラス内に次のような記述をすればよいです。
- 「public」はアクセス修飾子と呼ばれるものです。詳しくはこちらの外部サイト⇒アクセス修飾子
class Vector2 { public: double x, y; };
例えばメイン関数内でxを書き換える場合は、
vec.x = 3;
などのように「クラス型変数名.メンバ変数名」とすればよいです。
メンバ関数
- 変数と同様に関数もクラス内で宣言でき、これをメンバ関数と呼びます。
- 基本的には変数の時と同様に「クラス型変数名.メンバ関数名(引数);」とすれば呼び出せます。
サンプルコード
以下のコードにクラスの基本的な利用方法をまとめました。
色々書き換えながら遊んでみてください。
#include <iostream> //クラスの宣言 class Vector2 { public: double x, y; //値設定のための関数 void set(double _x, double _y) { x = _x; y = _y; } }; int main() { //2次元ベクトル型変数の宣言 Vector2 vec; //x, y座標の設定(関数利用) vec.set(2, 3); //表示 std::cout << "(" << vec.x << ", " << vec.y << ")" << std::endl; }
実行結果
(2, 3)
コンストラクタ
メリット
簡単に言うとクラスの初期化時に呼び出すことができる関数がコンストラクタです。
先ほど2次元ベクトル型クラスでは宣言と同時に座標を設定するとき、
Vector2 vec; vec.set(2, 3);
と2行に分けて記述しましたが、コンストラクタを用いれば、宣言と同時に任意の処理が行えるので1行で記述することができます
解説
- 戻り値というものが存在しません(voidすら不要)。
- クラス名と同名の関数です。
- 引数を複数パターン用意すれば、コンストラクタも複数用意できます。
- 特に引数のないものをデフォルトコンストラクタと呼びます。
具体的にはVector2クラスでは
Vector2() {/*処理*/} //デフォルトコンストラクタ Vector2(double _x, double _y) {/*処理*/} //double型引数を2つ受け取る
と記述し、利用するには変数宣言の時に
Vector2 vec1; //「Vector2 vec();」でも可 Vector2 vec2(2, 3);
とすれば、
- 1行目:引数が無いのでデフォルトコンストラクタを呼び出せる。
- 2行目:double型の引数を2つ渡しているので、コンストラクタ2を呼び出せる。
使用例
#include <iostream> //クラスの宣言 class Vector2 { public: double x, y; //デフォルトコンストラクタ Vector2() { x = 0; y = 0; } //double型を2つ引数に取るコンストラクタ Vector2(double _x, double _y) { x = _x; y = _y; } //(x, y)を表示する関数 void display() { std::cout << "(" << x << ", " << y << ")" << std::endl; } }; int main() { //2次元ベクトル型変数の宣言 Vector2 vec1; vec1.display(); Vector2 vec2(2, 3); vec2.display(); }
実行結果
(0, 0) (2, 3)