ごくごく簡単なまとめですが、CとC++とJava比較してみました。
| 項目 | C | C++ | Java |
|---|---|---|---|
| 誕生年 | 1972 | 1983 | 1995 |
| 分類 | 手続き型言語 | オブジェクト指向型言語 | オブジェクト指向型言語 |
| 変数宣言時の型指定 | 必要(静的型付け) | 必要(静的型付け) | 必要(静的型付け) |
| クラスの概念 | なし | あり | あり |
| ファイル名とクラス名 | クラスの概念なし | 一致させる必要なし | 一致していなければならない(内部クラス除く) |
| 変数宣言時の初期値設定 | (※3) | (※3) | (※3) |
| 複数戻り値 | 不可 | 不可 | 不可 |
| アクセス修飾子 | なし | あり(※1)※正確にはアクセス指定子と呼ばれる | あり(※1) |
| 文字列型 | なし | あり | あり |
| 文字列の比較 | strcmp関数 | strcmp関数 | equalsメソッド |
| 文字列の結合 | strcat関数 | strcat関数 | +演算子 |
| 定数の宣言 | const | const | final |
| do-while文 | あり | あり | あり |
| 仮引数のない関数(メソッド) | voidまたは何も書かない | voidまたは何も書かない | 何も書かない |
| アドレス演算子 | & | & | なし |
| 拡張for文 | なし | あり(範囲for文と呼ばれる) | あり |
| 関数プロトタイプ宣言 | あり | あり | なし |
| 構造体 | あり(※2) | あり(※2) | なし |
| クラスの継承構文 | クラスの概念なし | : | extends |
| 多重継承 | クラスの概念なし | 可 | 不可 |
| switch構文 | あり(値は整数型でないといけない) | あり(値は整数型でないといけない) | あり |
| ヘッダファイル | あり | あり | なし |
| コンストラクタ | なし | あり | あり |
| デストラクタ | なし | あり(※オーバーロードはできない) | なし |
| 論理型 | bool (stdbool.hをinclude) | bool | boolean |
| 例外処理構文 | なし | try-catch(finallyはない) | try-catch-finally |
| ポインタ渡し | 可 | 可 | 不可 |
| 参照渡し | 不可 | 可 | 不可 |
(※1)アクセス修飾子の違い
Javaの場合、アクセス修飾子はメンバだけでなく、クラス自体にも付与できる。
C++の場合、アクセス修飾子ではなくアクセス指定子と呼ばれる。
C++の場合、クラス、構造体自体にアクセス指定子を付与することはできない。
またC++の場合、構造体のメンバのデフォルトはpublic、クラスのメンバのデフォルトはprivateになる。
(※2)CとC++の構造体の違い
struct StructA {
int n;
double d;
};
という構造体があるとする。
Cの場合はstructを省略することはできない。
struct StructA sa;
C++では、typedefを使わずともstructを省略できる。
StructA sa;
(※3)変数の初期化をしない場合の値
■C/C++の場合
ローカル変数の場合:不特定の値になる。
グローバル変数およびstatic変数の場合:決まった値(デフォルト値)になる。
■Javaの場合
ローカル変数の場合:初期化せずに参照しようとするとコンパイルエラーになる。
クラスのメンバ変数の場合:決まった値(デフォルト値)になる。