C++のクラスの仕組みとサンプルです。
目次
サンプル | クラスとは |
クラスのサンプル | |
クラスからインスタンスを生成する | |
クラスからインスタンスを生成しないで利用(静的変数と静的メソッド) |
クラスとは
- クラスは、データ(メンバ関数)と処理(メンバ関数)を定義できます。
- メンバ関数はフィールド、メンバ関数はメソッドとも呼ばれます。
- クラスは設計図や型枠のイメージです。
クラスのサンプル
クラスのサンプルです。2つのファイル(Color.h、Color.cpp)があります。
1.Color.h
Color.hは、クラスを定義しています。
クラスの定義は一般的にヘッダファイルで行います。
3~13行目までがColorというクラスです。
#include <string>
using namespace std;
class Color
{
//
private:
string name; //メンバ変数
//
public:
void print1(); //メンバ関数のプロトタイプ宣言
void print2(); //メンバ関数のプロトタイプ宣言
//
};
6行目は、privateを指定しています。privateが指定されているとクラスの外部からアクセスすることができません。(非公開の設定)
7行目は、メンバ変数です。
9行目は、publicを指定しています。publicが指定されているとクラスの外部からアクセスすることができます。(公開の設定)
10,11行目は、メンバ関数のプロトタイプ宣言です。
プロトタイプ宣言とは、戻り値の型、関数名、引数の型をコンパイラに知らせることです。
メンバ関数の処理の記述は、Color.cppにあります。
メンバ関数とはJavaでいうメソッドにあたります。
13行目は、ブロックの後にセミコロンが必要です。
ブロックとは波かっこ( { } )を指します。
2.Color.cpp
Color.cppは、メンバ関数を実装しているファイルです。
メンバ関数とはJavaでいうメソッドにあたります。
メンバ関数の処理内容を記述することを「メンバ関数を実装する」といいます。
#include "Color.h"
#include <iostream>
using namespace std;
//
void Color::print1()
{
name = "red";
cout << "The color is " << name << "\n";
return;
}
//
void Color::print2()
{
name = "blue";
cout << "The color is " << name << "\n";
return;
}
5行目は、Color.hの10行目のメンバ関数の処理内容を記述しています。
構文は以下のとおりです。
void Color::print1()
戻り値のデータ型 クラス名::メンバ関数名(引数のデータ型 引数)
→引数は無しで戻り値もなし
7行目のメンバ変数の定義は、Color.hの7行目にあります。
12行目は、Color.hの11行目のメンバ関数の処理内容を記述しています。
クラスからオブジェクト(インスタンス)を生成する
データ型とクラス名を書くまたはnew演算子を使用してオブジェクト(インスタンス)を生成します。インスタンス化といいます。
データ型 クラス名; データ型 変数 = new クラス名(); //クラスからインスタンスを生成 |
上記の図はクラスからオブジェクト(インスタンス)を3つ生成したときのイメージです。
オブジェクトごとにデータを管理できます。
例えると、クラスは設計図、型枠でインスタンスは実体です。
クラスからオブジェクトを生成して利用するサンプルです。
上記「クラスのサンプル」のColorラスからオブジェクトを生成します。ファイル名はtest1.cppです。
#include "Color.h"
int main() {
Color c1;
c1.print1(); // The color is red
c1.print2(); // The color is blue
Color *c2 = new Color();
c2->print1(); // The color is red
c2->print2(); // The color is blue
delete c2;
return 0;
}
5行目は、クラスのオブジェクト(インスタンス)を生成しています。
(Color型のc1というオブジェクトを生成)
6,7行目は、クラスのメンバ関数です。Color.cppのprint1()とprint2()を呼び出しています。
9行目は、newでクラスのオブジェクト(インスタンス)を生成しています。
10,11行目は、アロー(->)でメンバ関数を実行しています。
12行目は、deleteでオブジェクトを削除しています。
クラスからインスタンスを生成しないで利用(静的変数と静的メソッド)
クラスからオブジェクトを生成しないサンプルです。
static修飾子を追加します。
#include <iostream>
using namespace std;
//クラスを定義
class Color
{
private:
static string name; //staticメンバ変数
public:
static void getName(); //staticメンバ関数
};
string Color::name = "RED-";
//メンバ関数の実装
void Color::getName()
{
cout << name;
cout << "BLUE\n";
return;
}
//クラスを使用
int main() {
Color::getName(); //RED-BLUE
return 0;
}
8行目は変数名の前にstaticがついています。staticメンバ変数(静的メンバ変数)です。
10行目はメソッド名の前にstaticがついています。staticメンバ関数(静的メンバ関数)です。
13行目は、staticメンバ変数に値を設定しています。
24行目は、クラスをインスタンス化していませんがクラスのメソッドを実行できます。
関連の記事