C++のプログラミング

 

1.文字列の扱い

C++は文字列の扱いがCより便利である。まず、次の簡単なプログラムを見よう。

 

プログラム例

-------------------------------------------ここから-----------------------------------------------------

#include <iostream>

using namespace std;

 

int main()

{

       cout << "田中研究室にようこそ!\n";

       return 0;

}

 

説明

C++では、stdio.hではなく、iostreamincludeする。

using namespace std;

「名前空間」として、標準(std)を使う(とりあえず、ここではこうすることにする)

cout << 出力文字列;

入力の場合は、

cin >> 変数;

とする。

--------------------------------------------ここまで----------------------------------------------------

 

文字列の扱いの便利さは、formatが不要なだけでなく、

(1) 比較が == でできる。

(2) 文字列の取り扱いに便利な関数を伴っている。

という特徴がある。

 

(1) について

次のプログラム例を見よう。

-------------------------------------------ここから-----------------------------------------------------

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

       string prof;

 

       cout << "知能情報学部です。\n";

       cout << "あなたの好きな教員名を1つ入力してください:";

       cin >> prof;

 

       if (prof == "田中")

              cout << "ありがとうございます!\n";

       else {

              cout << prof << "先生はとてもよい先生ですね。\n";

              cout << "田中もよろしくお願いします。\n";

       }

       return 0;

}

C言語での文字列の比較は、==は使えず、

if (strcmp(prof, “田中”) == 0)

などとしなければならなかったことに注意。

--------------------------------------------ここまで----------------------------------------------------

 

(2)について

プログラム例を見る。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

       string s;

       int len;

 

       cout << "文字列を入れてください:";

       cin >> s;

 

       len = s.length();

       cout << "" << s <<  "" << "の長さは" << len << "バイトです。\n";

 

       return 0;

}

 

string型で定義されている変数であるが、string型はC言語にはなく、C++の仕様で追加されている型である。この型には、長さを返す関数が内包されており、

s.length()

という形で長さを取り出すことができる。

--------------------------------------------ここまで----------------------------------------------------

 

 

 

 

2.クラスについて

 

クラス=データ+手続き

とも言える。非常に関係が深いものとして、諸君が既に知っている、C言語の構造体をまず復習しよう。

 

C言語の構造体はこのようにして定義する。

struct ABC {

int i;

double p;

};

 

C++言語の構造体では、関数も使える。たとえば以下のプログラム例を参照。

 

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//構造体ABCの定義

struct ABC{

       int i;

       int j;

       int func1(){ return i + j;} //C++では関数が使える。C言語の構造体では関数は使えない

};

int main()

{

       ABC pqr; //構造体ABC型の変数 pqrの定義

       int k;

 

       pqr.i=1;

       pqr.j=2;

       k = pqr.func1();

       printf("%d\n",k);

}

--------------------------------------------ここまで----------------------------------------------------

 

次に、構造体ではなく、クラスを使う例を示す。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

       int i;

       int j;

       int func1(){ return i + j;}

};

int main()

{

       ABC pqr; //クラスABCのインスタンス pqrの定義

       int k;

 

       pqr.i=1;

       pqr.j=2;

       k = pqr.func1();

       printf("%d\n",k);

}

 

説明

しかし、これはエラーとなる。クラスの中のメンバーやメンバー関数は、クラスの外からはそのままでは使えない。

クラスの中のメンバーやメンバー関数は、クラスの外からでも使えるものと、使えないものを分けて記述することができる。外から使えるようにするためには、

class ABC {

public:

….

…..

private:

…..

…..

};

とする。構造体は、クラスにおいて、メンバーやメンバー関数全部をpublicにするのと同じであると理解しておくとよい。

クラスの記述の中で、publicprivateを明らかにしない場合は、全部privateとして扱われる。そのため、エラーとなったのである。

動くようにすると、

 

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

       int i;

       int j;

       int func1(){ return i + j;}

};

int main()

{

       ABC pqr; //クラスABCのインスタンス pqrの定義

       int k;

 

       pqr.i=1;

       pqr.j=2;

       k = pqr.func1();

       printf("%d\n",k);

}

 

 

 

ABC pqr;

の部分でのpqrをインスタンスという。

-------------------------------------------ここまで-----------------------------------------------------

 

 

 

 

 

クラスは、単にそれだけではなく、それ以外に知っておくべき基本的事項がある。

 

・メンバー関数の記載方法

(1) インライン関数を使う

上記で書いた方法。短い場合に有効。

(2) スコープ演算子::を使う

 

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

       int i;

       int j;

       int func1();

};

int ABC::func1()

{

       return i + j;

}

int main()

{

       ABC pqr; //クラスABCのインスタンス pqrの定義

       int k;

 

       pqr.i=1;

       pqr.j=2;

       k = pqr.func1();

       printf("%d\n",k);

}

 

--------------------------------------------ここまで----------------------------------------------------

 

・インスタンスを定義したときに実行されるコンストラクタと、インスタンスが消えるときに実行されるデストラクタ

これらは、特殊なメンバー関数である。自動的に実行される。定義の方法も、通常のメンバー関数とは異なっている。

 

次のプログラムを解釈し、実行してみよ。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

       int i;

       int j;

       int sum;

       void func1();

       ABC(); //これがコンストラクタの宣言

       ~ABC(); //これがデストラクタの宣言

};

void ABC::func1(){

       sum += j;

}

ABC::ABC()

{

       sum=0;

       cin >> i;

}

ABC::~ABC()

{

       cout << "=" << sum << endl;

}

 

int main()

{

       ABC pqr;

       for (pqr.j=1; pqr.j<=pqr.i; pqr.j++){

              pqr.func1();

       }

}

 

・コンストラクタ、デストラクタは、定義していないときには、「何もしない」というコンストラクタ、デストラクタが自動的に生成され、実行される。

 

・インスタンスはコピー可能

ABC c;

ABC d = c; //コピー

コピーした場合は、「コピーコンストラクタ」が呼び出される。コンストラクタ同様の定義方法であるが、引数がつく。たとえば、

ABC(const ABC& c)

と宣言する。cは仮引数。

 

コンストラクタは、引数があるメンバー関数を使うときには注意が必要。

--------------------------------------------ここまで----------------------------------------------------

応用(入出力)

標準入出力(キーボード入力、画面出力)には、iostreamincludeして、cout, cinを使う。

#include <iostream>
using namespace std;
int main( )
{
  cout << "abc" << endl;
  return 0;
}

 

C++でファイル入力出力には,fstreamを使う。

ifstreamクラスでファイルから入力

ofstreamクラスでファイルへ出力する



-----------------------------------

#include <fstream>

using namespace std;

int main()

{

        ofstream ofs( "test.txt" );

 

        ofs << "testmessage" << 123 << endl;

 

        return 0;

}

同じ内容を、キーボードから入力したファイル名で保存

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main()

{

        string fn;

        cout << "filename? ";

        cin >> fn;

        ofstream ofs(fn);

 

        ofs << "testmessage" << 123 << endl;

 

        return 0;

}