■C++を学ぼう!
「C++を学ぼう!」では、C++の初心者をターゲットにC++言語を体系的に学べるようにサイトを構築しています。
管理人もC++を学びながら作っていますので、分かり難い点などあればご指摘下さい。

▼スポンサードリンク
■メニュー

(C)あいねこの館

文章などの改変・利用は禁止します
クラス

クラスの定義方法
クラスは下記のように定義することが出来ます。
class Car{
char name[20];
int speed;
};
上記はクラスCarの宣言方法です。
クラスの中にメンバー変数を宣言できます。

クラスを作成したらそのクラスを利用するために変数を宣言します。
Car kind;
型 変数名;

このクラスの変数をオブジェクトまたはインスタンスと言います。

それではこのメンバー変数をどのように利用すればいいのでしょうか?
それは、変数.メンバー変数とします。
ですのでkind.speedで利用することが出来ます。

それではクラスを用いたサンプルプログラムを紹介します。

#include <iostream>
#include <string>

using namespace std;

//クラスCarを宣言する
class Car{
public:
	//メンバー変数を宣言する
	char name[10];
	int speed;
};

int main(){
	
	//クラスCarの変数kindを宣言する
	Car kind;

	//クラスのメンバー変数を設定する
	kind.speed = 10;
	strcpy(kind.name,"test");

	//クラスCarのインスタンスkindの変数を表示する
	cout << "speed:" << kind.speed << " name:" << kind.name << endl;

}
実行結果は以下の通りです。
speed:10 name:test
publicはクラス外からメンバー変数を参照できるように宣言します。
もう1つprivateでは、クラスの外からは利用できないので、メンバー関数だけが利用出来ます。
privateを設定しないと、初期はprivateとなります。

メンバー関数
クラスの中にクラス独自の関数を設計することが出来ます。
関数の宣言方法はクラス内とクラス外のどちらでも宣言が可能です。
#include <iostream>
#include <string>

using namespace std;

//クラスCarを設定する
class Car{
public:

	//メンバー変数を設定する
	char name[10];
	int speed;

	//メンバー関数を設定する
	void run();
	void set(int i,char *n);
	void stop(){
		cout << "車は止まりました。" << endl;
	}
};

//クラスCarのメンバー関数runの設定
void Car::run(){
	cout << "車が進みました!" << endl;
}

//クラスCarのメンバー変数setの設定
void Car::set(int i,char *n){
	cout << "車の初期値を設定します。" << endl;
	speed = i;
	strcpy(name,n);
}

int main(){
	
	//クラスCarの変数kindを設定する
	Car kind;

	//車の初期値を設定する
	kind.set(10,"gogogo");

	//クラスCarのインスタンスkindの変数を表示する
	cout << "speed:" << kind.speed << "km/h name:" << kind.name << endl;

	//クラスCarのメンバー関数stopを呼び出す
	kind.stop();

}
実行結果は以下の通りです。
車の初期値を設定します。
speed:10 name:gogogo
車は止まりました。
それでは、何故、publicで公開にし、privateでクラス内だけにするのでしょうか?
publicで宣言すると、クラス外から変数・関数が見えてしまいます。
クラスのメンテナンスを行い、メンバー変数を変更すると、全ての関数で利用している変数を 変更しなければなりません。これではかなり効率が悪いです。
この為、なるべく必要最低限以外は公開しない方がプログラムの保守性が高くなります。

コンストラクタとデストラクタ
コンストラクタはインスタンスが宣言された時に初期に自動的に実行されます。
コンストラクタの決まりは下記の通りです。
1.関数名はクラス名と一緒 2.public内で宣言する 3.値を返すことは出来ない 例: class Test{ Test();⇒コンストラクタになる }
#include <iostream>
#include <string>

using namespace std;

//クラスCarを設定する
class Car{
public:

	//メンバー変数を設定する
	char name[10];
	int speed;

	//メンバー関数を設定する
	void run();
	void set(int i,char *n);
	void stop(){
		cout << "車は止まりました。" << endl;
	}
	Car();

};

//クラスCarのコンストラクタ
Car::Car(){
	cout << "初期設定をします!" << endl;
	speed = 0;
	strcpy(name,"no_name");
	cout << "speed:" << speed << " name:" << name << endl;
	
}

//クラスCarのメンバー関数runの設定
void Car::run(){
	cout << "車が進みました!" << endl;
}

//クラスCarのメンバー変数setの設定
void Car::set(int i,char *n){
	cout << "車の初期値を設定します。" << endl;
	speed = i;
	strcpy(name,n);
}

int main(){
	
	//クラスCarの変数kindを設定する
	Car kind;

	//車の初期値を設定する
	//kind.set(10,"gogogo");

	//クラスCarのインスタンスkindの変数を表示する
	//cout << "speed:" << kind.speed << " name:" << kind.name << endl;

	//クラスCarのメンバー関数stopを呼び出す
	//kind.stop();

}
実行結果は以下の通りです。
初期設定をします!
speed:0 name:no_name
また、コンストラクタは多重定義ができ、変数の型が異なると幾つも宣言することが可能です。
例:
Car();
Car(int a);
Car(char *n);

また、インスタンスを生成する時に、コンストラクタに値を反映させることも出来ます。
#include <iostream>
#include <string>

using namespace std;

//クラスCarを設定する
class Car{
public:

	//メンバー変数を設定する
	char name[20];
	int speed;

	//メンバー関数を設定する
	void run();
	void set(int i,char *n);
	void stop(){
		cout << "車は止まりました。" << endl;
	}
	Car(int i,char *n);

};

//クラスCarのコンストラクタ
Car::Car(int i,char *n){
	cout << "初期設定をします!" << endl;
	cout << i << endl;
	speed = i;
	strcpy(name,n);
	cout << "speed:" << speed << " name:" << name << endl;
	
}

//クラスCarのメンバー関数runの設定
void Car::run(){
	cout << "車が進みました!" << endl;
}

//クラスCarのメンバー変数setの設定
void Car::set(int i,char *n){
	cout << "車の初期値を設定します。" << endl;
	speed = i;
	strcpy(name,n);
}

int main(){
	
	//クラスCarの変数kindを設定する
	Car kind(5,"スペシャルカー");

	//車の初期値を設定する
	//kind.set(10,"gogogo");

	//クラスCarのインスタンスkindの変数を表示する
	//cout << "speed:" << kind.speed << " name:" << kind.name << endl;

	//クラスCarのメンバー関数stopを呼び出す
	//kind.stop();

}
実行結果は以下の通りです。
初期設定をします!
speed:5 name:スペシャルカー
次に、デストラクタを紹介します。
デストラクタはコンストラクタとは逆の意味になります。
オブジェクトの後処理を行うことになる。
その開始は、オブジェクトのメモリが開放されるときなので、下記の例ではmain関数が終了するときに 実行される。
1.クラス名と同じ名前で先頭に~チルダを付ける 2.public内に宣言する 3.型の指定は出来ない 4.引数の指定は出来ない 5.多重定義も出来ない 例: クラス内 ~Car(); クラス外 Car::~Car(){ }
デストラクタの主な使用方法はプログラムが終了した後処理を記述することになります。

#include <iostream>
#include <string>

using namespace std;

//クラスCarを設定する
class Car{
public:

	//メンバー変数を設定する
	char name[20];
	int speed;

	//メンバー関数を設定する
	void run();
	void set(int i,char *n);
	void stop(){
		cout << "車は止まりました。" << endl;
	}
	Car(int i,char *n);
	~Car();
};

//クラスCarのデストラクタ
Car::~Car(){
	cout << "デストラクタが実行されました!" << endl;
}

//クラスCarのコンストラクタ
Car::Car(int i,char *n){
	cout << "初期設定をします!" << endl;
	strcpy(name,n);
	speed = i;
	cout << "speed:" << speed << " name:" << name << endl;
	
}

//クラスCarのメンバー関数runの設定
void Car::run(){
	cout << "車が進みました!" << endl;
}

//クラスCarのメンバー変数setの設定
void Car::set(int i,char *n){
	cout << "車の初期値を設定します。" << endl;
	speed = i;
	strcpy(name,n);
}

int main(){
	
	//クラスCarの変数kindを設定する
	Car kind(5,"スペシャルカー");

	//車の初期値を設定する
	//kind.set(10,"gogogo");

	//クラスCarのインスタンスkindの変数を表示する
	//cout << "speed:" << kind.speed << " name:" << kind.name << endl;

	//クラスCarのメンバー関数stopを呼び出す
	//kind.stop();

}
実行結果は以下の通りです。
初期設定をします!
speed:5 name:スペシャルカー
デストラクタが実行されました!※プログラム終了後に表示される