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