C++入門::付録
ロボコンとは関係無いですが,とりあえず.ちなみに,かかれているソースは一度もテストしてません.コンパイルすら通らないかも.
CとC++
C++はCのスーパーセット
つまり,基本的にCで使えた機能はC++でも使えます.
オブジェクト指向言語を取り入れた言語
オブジェクト指向というものを取り入れた言語になっています.オブジェクト指向というのは,「オブジェクト」という「物」を焦点にあてて考えるということです.実現するための仕組みが「クラス」と呼ばれているもので,構造体のお化けみたいなものです.(というか,構造体がクラスの特殊形なのですが…)
オブジェクト指向なんか無視してC言語と同じように
bool型
C言語でもBOOLという名前で定義して使うことが多いですが,中身はintでした.
C++では真偽値を扱うbool型が存在します.とりうる値は,trueかfalseです.intにキャストすると,1か0になります.
参照
int &a = b;
aはbと同じように使えます.関数を呼び出すときにも使えますが,関数内で値を変更したりすると混乱の元になるので,constが付くとき以外は気をつけましょう.
クラス
構造体はデータしか入れて置けませんが,クラスを使うと関数も一まとめに管理できます.また,内部のデータや関数へのアクセスを制限する機能も持っています.
C++に出てくる構造体は,実はクラスなので関数を内部に書いたりも出来ます.
class Position{ int px; int py; public: void set_x(int x) { px = x; } int get_x() { return px; } Position(int x,int y) { px=x,py=y; } };
newとdelete
C言語ではメモリを動的に確保したいとき,標準関数のmalloc等を使っていましたが,C++では言語として用意されています.
Position *pos = new Position(10,20); // 生成(確保) delete pos; // 削除(開放)
newはmallocと違って内部の初期化も行います.具体的には,クラスと同じ名前を持つメンバ関数(コンストラクタ)を呼び出してくれます.また,コンストラクタに値を渡すことが出来ます.
関数のオーバーロード
引数の型が違えば,同じ名前の関数が存在しても構いません.
例えば,C言語の場合,
void print_int(int i) { printf("%d\n",i); } void print_str(char *s) { printf("%s\n",s); } int main() { int a=10; char b[]="ABC"; print_int(a) print_str(b) return 0; }
というように,違う型に対する処理に別々の関数名をつけなければなりませんでしたが,C++では,
void print(int i) { printf("%d\n",i); } void print(char *s) { printf("%s\n",s); } int main() { int a=10; char b[]="ABC"; print(a) print(b) return 0; }
というように,同じ名前の関数にすることが出来ます.関数を呼び出すときに,書き分けなくていいので楽ですね.
演算子のオーバーロード
C言語では,自分で作った構造体等に対する演算子を自分で定義できませんでした.構造体の(=)だけは可能でしたが.
C++では,殆どの演算子についての動作を定義できます.
例えば,座標を格納した構造体同士の和を求めることを考えます.
struct POSITON{ int x; int y; }; POSITON sum(POSITON p1,POSITON p2) { POSITON p; p.x = p1.x + p2.x; p.y = p1.y + p2.y; return p; } int main() { struct POSITON a; struct POSITON b; struct POSITON c; a.x=10; a.y=10; b.x=20; b.y=30; c = sum(a,b); }
というように,sum(a,b)と関数を明示的に呼ぶ必用がありました.
class Position{ public: int x; int y; Position operator+(Position &p1, Position &p2) { Position p; p.x = p1.x + p2.x; p.y = p1.y + p2.y; return p; } }; int main() { Position a; Position b; a.x=10; a.y=10; b.x=20; b.y=30; Position c = a+b; }
C++では,a+bと書くことができます.同じように,「-」で距離を求めたりもできます.
テンプレート
簡単に言えばクラスや関数に「型」を渡して,その型にあわせたクラスを自動生成する機能です.
こんなこともできるようです.使いこなせば,なかなか強力ですね.
STL
C言語の標準関数と同じようなものとしてSTL(Standard Template Library)があります.Cの標準関数も使えますが,STLを使うとC++らしいプログラムになります.
STLには,リストやツリー等のデータ構造や,ソート等のアルゴリズムも含まれます.