メンバー関数
クラスの中にクラス独自の関数を設計することが出来ます。
関数の宣言方法はクラス内とクラス外のどちらでも宣言が可能です。
#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:スペシャルカー
デストラクタが実行されました!※プログラム終了後に表示される