Cで書いたプログラムは そのままコンパイルすることは可能です。 例えば、Hello World はそのまま c++ 出来ます。
> cat hello.c
#include "stdio.h"
main (){
printf( "hello world\n");
}
> g++ hello.c
> ./a.out
hello world
既存の C プログラムに次のような 宣言をつけておけば、これをコンパイルした後で、 C++ で書いたものと リンカーの処理の段階で混ぜることが出来ます。
extern "C"
実際にはそれほど簡単ではないはずですが、例えば、次のところに情報 があります。
次のように C の方法と、// で始まる行の二通りが使えます
/* コメント */ // コメント
次の例では bufsize が書込禁止の変数になります。 C にも const はあります。しかし、初期化する時に使うだけで、 変更出来ないという属性が付く訳ではありません。このため 次のような 使い方は出来ません。
main () {
const int bufsize = 255;
char buffer[bufsize] = "xyz";
}
これは C++ ではコンパイル出来ますが、C では、次のように buffer が可変長のオブジェクトとみなされ、bufsize を固定としたつもりでも、 そうは解釈されないため、誤りとされます。
$ cc const-array.c const-array.c: In function `main': const-array.c:3: error: variable-sized object may not be initialized
C++ では標準出力に表示する時には次のように cout << という文を使うのが流儀です。 endl で改行を表わします。
$ cat helloworld.c
# include <iostream>
using namespace std;
int main () {
cout << "Hello World!" << endl;
return 0;
}
$ c++ helloworld.c
$ a.exe
Hello World!
$
C では真か偽かを保存するのに int 型の変数などを使い、「0 なら偽 1 なら真」のように 代用していました。C++ では boot 型の変数を使うことが出来ます。 これに対応して true/false という変数が定義済になっています。 ただし何も考えずに表示すると 1/0 になります。
$ cat boolean.c
# include <iostream>
using namespace std;
int main () {
bool nameTOsave;
nameTOsave = false;
cout << nameTOsave << endl;
nameTOsave = true;
cout << nameTOsave << endl;
return 0;
}
$ c++ boolean.c
$ a.exe
0
1
$
仮引数名は省略することが出来ます。 関数の宣言時には、仮引数の名前を省いて、 その型を宣言するという方法が使えます。
int user_func(int, double, char* []);
関数を宣言する時に、引数に 「= 初期値」を付けておきます。 そうして、これを呼ぶ時に、その引数を省略します。すると、その 引数には、その初期値が代入されます。 ただし、当然のことですが、いくつかある引数のうち、 途中の引数だけを省略することは出来ません。
書かれた C++ を見ていると、 一つのクラスの中に、 同じ関数名がいくつも定義されていることがあります。 ただし、良く見ると関数名は同じでも引数の個数や型が違って います。これはオーバ・ロードと言って、日本語では多重定義とも呼びます。 これらの関数を呼ぶ時には、その引数を見て、 その引数と同じに定義されている関数定義が呼ばれます。
C++ の場合には = == << などの演算子も、実は関数と同じに扱われるので、 同様のオーバロードが行なわれます。
次の書き方は、x の値を 128 に初期化します。
int x (128);
これは次のようにも書けますが、これは代入ではなくて初期化です。
int x = 128;
これは説明すると一冊の本が書けてしまうくらいの情報量が必要です。 しかし簡単に名前だけ挙げると、次のようなものがあります。
| 名前空間 | 名前空間を作って、同じ名前の関数名の衝突を避けられる |
| new | メモリ領域を確保する方法として安全なnewが用意されている |
| クラス | 構造体(struct)を拡張してクラス(class)が用意されている。その中に関数が書ける、公開・非公開を設定出来るなど、構造体とは大きな違いがある。 |
| 継承 | 継承という考えを使って効率的・かつ柔軟なクラス記述が出来る |
| 多重定義 | 同じ名前でも引数が違う関数や演算子の意味を多重定義(オーバロード)出来る |
| 関数テンプレート | 関数テンプレートを使って関数を柔軟に定義出来る |