はじめに
CではなくC++を使う理由の大半がこのクラスを作ることができるという点にあると思います。
クラスはざっとした理解はとても簡単で、それでもやっぱり使いこなすのは難しいという厄介な分野です。
しっかりと勉強して、復習して、本物のC++使いになれるように頑張りましょう!
クラスとはなんなのか
クラスは何かについての様々なデータと操作について、まとめておくための枠組みです。
例えば、パソコンについてのクラスを作るとするとデータと操作(関数)は次のようになります。
- データ
- OSの種類
- 画面サイズ
- CPUの種類
- GPUの種類
- 操作(関数)
- PCの起動方法
- ソフトウェアの起動方法
- 入力方法
これらをパソコンクラスという枠組みでまとめておくことで、枠組みに沿って製品を作るとパソコンが出来上がるというわけです。
クラスはパソコンを作るための枠組みであってパソコンではありません。大切なので覚えておいてください。
また、既にC言語を学んでいる人にとっては、構造体に関数が入れられるようになったものという感じです。
クラスの宣言
では実際にクラスを宣言しましょう。
クラスは次のようにして宣言することができます。
class クラス名{ 内容 };
内容はデータだけ操作だけ、両方、はたまた何もなし、いずれでも宣言可能です。順番も特に決まりはありません。
メンバ変数とは?
クラスの中に宣言するデータのことをメンバ変数と呼びます。代わりとなる手段は存在しますが、通常の変数のように初期化することはできません。
例えばint型のメンバ変数を2つ、double型のメンバ変数を1つ持つようなクラスであれば次のように宣言します。
class sample{ int a,b; double c; };
ただしこのように宣言すると、このクラスは全く意味を成しません。次で説明します。
アクセスコントロールについて
実はクラスの中のデータや操作には次のような二つの種類があります。
- private:クラスの内部からアクセス可能、外部からはアクセス不可能
- public:クラスの内外どちらからもアクセス可能
注)内部からのアクセスとは、主にクラス内部に宣言した関数からのアクセスを意味します。内部に宣言した外部からアクセス可能な関数もこれに含まれます。
これらをアクセスコントロールといい、「private:」の後に書かれていれば「private」として扱われ、「public:」の後に書かれていれば「public」として扱われます。何も指定しない場合には「private」として扱われます。
先ほど宣言したクラスは、クラスの内部からしかアクセスできないデータのみを宣言していたので意味がなかったのです。
例えば、先ほどのクラスに、メンバ変数にデータを与えるような関数と、メンバ変数を利用する関数を「public」で宣言すると、意味があるクラスになりますね。
また、次のようにアクセスコントロールは何度も使って大丈夫です。
class sample{ int a; public: int b; private: int c; public: int d; };
この場合は
- aとc:private
- bとd:public
となります。
メンバ関数とは?
クラスの中で宣言する関数のことをメンバ関数と呼びます。
メンバ関数の宣言には、クラス内に直接書く方法とクラス内でプロトタイプ宣言する方法の二つの方法があります。
例として、整数値を二つ入力させるという関数を宣言するとします。
クラス内に直接書く場合には次のようにします。
class sample{ int a,b; public: void inp(){ std::cout << "整数値を二つ入力してください" << std::endl; std::cin >> a >> b; } };
こちらは通常の関数と同じように記述するだけです。
次に、クラス内でプロトタイプ宣言する場合についてです。
class sample{ int a,b; public: void inp(); }; void sample::inp(){ std::cout << "整数値を二つ入力してください" << std::endl; std::cin >> a >> b; }
ここで通常と異なる点は、関数を宣言する際にスコープ演算子「::」を用いて次のように定義する必要がある点です。
返り値のデータ型 クラス名::関数名(){ 内容 }
このようにして書くことで例のプログラムでは「sampleクラスのinp()関数の定義である」という意味を持ちます。
オブジェクトの生成
クラス(枠組み)を作ってもオブジェクト(製品)は出来上がりません。オブジェクトは次のようにして生成します。
クラス名 オブジェクト名;
またオブジェクトを作った段階では中身のない製品であり、データにアクセスして製品の詳細を入力するのが一般的です(要するにメンバ変数などに外部からアクセスしてデータを入力するということ)。
クラスの外部からメンバへのアクセス
クラスの外部からメンバ変数、およびメンバ関数にアクセスする場合にはドット演算子というものを使って次のようにしてアクセスします。
オブジェクト名.メンバ変数(関数)
実際のプログラムでみていきましょう。
#include<iostream> class sample{ //sampleクラスの宣言 int a,b; //private int型 public: void inp(); int hoge(){ return a*a + b*b; } }; void sample::inp(){ //外部からアクセスしてprivateのメンバ変数に値を入力 std::cout << "整数値を二つ入力してください" << std::endl; std::cin >> a >> b; } int main(){ sample test; //sampleクラスのtestオブジェクトの生成 test.inp(); //メンバ関数inp()の呼び出し std::cout << test.hoge() << std::endl; //メンバ関数hoge()の呼び出し }
メイン関数に注目して考えると次のようになります。
- sampleクラスからtestオブジェクトを生成
- testオブジェクトについて
- privateのint型メンバ変数a,b
- publicのvoid型メンバ関数int(),int型メンバ関数hoge()
- inp()でa,bにデータを入力してhoge()によって二乗の和を求めることができる
- testオブジェクトについて
- メイン関数からtestオブジェクトのinp()を呼び出す
- メイン関数からtestオブジェクトのhoge()を呼び出して標準出力で出力
inp()を呼び出さなくてもhoge()を呼び出すことはできますが、配列と似ていて、各メンバ変数には適当な値が入っているので出力されるのは「0」とは限りません。
基本的にメンバ変数には最初にデータを与えるようにしましょう。
演習問題
今回はここまでです。最後に演習問題を解いてここまでの内容をしっかりと理解していってください。
演習問題
次の要件を満たすプログラムを作成せよ。
- 次の要件を満たすクラスを作成する
- メンバ変数を二つ宣言
- メンバ変数に標準入力から値を入力するメンバ関数を宣言
- 和の絶対値と差の絶対値を求めるメンバ関数を宣言
- メイン関数で作成したクラスからオブジェクトを生成
- 二つの数値を入力したら和の絶対値と差の絶対値が出力される
演習問題解答
いくつかの解答があると思われるが、解答例として以下のプログラムを用意した。
#include<iostream> class abv{ //abvクラスの宣言 int a,b; //private int型 public: void inp(); //public void型 int add(){ //public int型 和の絶対値 if(a+b > 0){ return a+b; }else{ return -a-b; } } int dif(){ //public int型 差の絶対値 if(a-b > 0){ return a-b; }else{ return b-a; } } }; void abv::inp(){ //外部からアクセスしてprivateのメンバ変数に値を入力 std::cout << "整数値を二つ入力してください" << std::endl; std::cin >> a >> b; } int main(){ abv temp; //abvクラスのtempオブジェクトの生成 temp.inp(); //メンバ関数inp()の呼び出し std::cout << temp.add() << std::endl; std::cout << temp.dif() << std::endl; return 0; }
最後に
クラスについては複数回に分けて書いていきます。
しっかりとゆっくりとでいいので覚えていきましょう!
続きはこちらです。
コメント