C++のプログラミング
1.文字列の扱い
C++は文字列の扱いがCより便利である。まず、次の簡単なプログラムを見よう。
プログラム例
-------------------------------------------ここから-----------------------------------------------------
#include <iostream>
using namespace std;
int
main()
{
cout << "田中研究室にようこそ!\n";
return 0;
}
説明
C++では、stdio.hではなく、iostreamをincludeする。,iostreamがなぜ必要なのか知りたければ、試しに1行目のincludeをコメントアウトしてみればよい(//を先頭につける)
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にするのと同じであると理解しておくとよい。
クラスの記述の中で、publicとprivateを明らかにしない場合は、全部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は仮引数。
コンストラクタは、引数があるメンバー関数を使うときには注意が必要。
--------------------------------------------ここまで----------------------------------------------------
応用(入出力)
標準入出力(キーボード入力、画面出力)には、iostreamをincludeして、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;
}
第1回課題
クラスを用いて、次のような動作をするプログラムを作成せよ。
=============================================
データ入力部分
d[0]= 10
d[1]= 8
d[2]= 3
d[3]= 12
d[4]= 20
結果表示部分
1番目に小さい値=3
2番目に小さい値=8
3番目に小さい値=10
4番目に小さい値=12
5番目に小さい値=20
続行するには何かキーを押してください . . .
プログラム(穴埋め方式)
#include <iostream>
#include <string>
using namespace std;
//クラスSORTの定義
class SORT{
public:
int d[5];
int i;
int j;
int dummy;
void
func1();
SORT();
//これがコンストラクタの宣言
~SORT();
//これがデストラクタの宣言
};
void SORT::func1(){
}
SORT::SORT()
{
}
SORT::~SORT()
{
}
int main()
{
SORT pqr;
pqr.func1();
}