ちょっとだけC++

C++はC言語をオブジェクト指向な仕様が追加されたものです。 C言語の上位互換なので、CプログラムをC++コンパイラでコンパイルすることもできます。 オブジェクト指向とかわからなくても、 C言語よりも便利な機能がありますので、さわりだけほんのちょっと紹介です。

コンパイラ

GNUのコンパイラなら gcc のかわりに g++ を使いましょう。ほら、もう気分はC++。

コメント

C言語では/* */ですが、C++では//と書けばその後ろはコメントになります。

  /# コメント #/
  // コメント

実は、gnus のCコンパイラでも、バージョン3.0あたりからこのC++スタイルのコメントを使えます。

多重定義

2つの整数を足す関数の定義はC言語なら

 int plus(int a, int b){return a+b;}

となります。さらに2つのdoubleを足す関数を作りたいときは違う名前の関数を用意する必要があります。例えば

double plusdb(double a, double b){return a+b;}

とします。 C++なら同じ名前で違う引数の関数を作れます。つまり double plus(double a, double b){return a+b;} とすれば、引数に応じて適切な関数が選択・実行されます。

定数型

C言語ではマクロ定義により

 #define MAX 10

として、定数を扱うことがよくあります。しかし、マクロ定義は時々思わぬトラブルを起こします。例えば

 #define MAX - 10

とすると、

a=2*MAX;

は、

a=2*-10;

とマクロ置換されて、わけわからなくなります。C++では定数を

const int MAX=-10;

と書けばMAXを定数として扱う(値の変更は許さない)ことができます。 (gccでは,この仕様もだいぶん前ににとりこまれています。)

inline

短い関数はinline定義をしましょう。

inline double plus(double x, double y){retrun x+y;}

もしinlineをつけなければコンパイル時に関数plusが機械語に翻訳されます。 つけたときには、plus(a,b)といった実行文は全て(a+b)に変更されてから翻訳されます。その結果、関数呼出のための実行速度が不要になり、プログラム処理が早くなります。

アドレス渡し

C言語では、関数が受け取った仮引数の値を変更して返したいとき、ポインタが必要でちょっと面倒です。例えば

void reverse(int *x){(*x)*=-1;}
...
int a=3;
reverse(&a);

といったかんじになります。C++では仮引数に&をつけるだけでアドレス渡しを実現でき、ポインタが不要になり、実引数もアドレスで渡す必要がありません。

void reverse(int &x){x*=-1;}
...
int a=3;
reverse(a);

cin,cout

C言語ではprintf,scanfの類を使うとき、%sやら%dやら書式設定が面倒です。C++ではprintfのかわりに

int i=3;
double x=2.0:
cout << "i=" << i <<"\n";
cout << "x=" << x << \n";

といった感じに書けて、型のことは気にせず出力できます。 標準入力からの読み込みは以下の通りです。

cin >>x;

なお、cin,coutを使うときにはヘッダファイルにiostream.hを読み込みましょう。

#include<iostream.h>

これでprintf,scanfを使わないなら stdio.h は多分不要になります。

ファイル入出力

cin, coutと同じようにファイル入出力もできます。“data.txt"というファイルから読み込みをしたいときにはこんなかんじ。

ifstream f;
double x;
f.open("data.txt");
f>>x;

逆に書き込みたいときにはこんなかんじ。

ofstream f;
double x=1.0;
f.open("data.txt");
f<<"x="<<x;

なお、ファイル入出力をするときには、ヘッダファイルfstream.hを読んどきましょう。

#include<fstream.h>

オブジェクト指向プログラミング

例えば、複素数を表す型(クラス)complexを用意して、doubleとかと同様の演算ができるように定義できます。

complex x,y,w,z;
...
z=x+y; w=x*y;

興味があれば勉強しませう。