ごくごく簡単なまとめですが、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の場合
ローカル変数の場合:初期化せずに参照しようとするとコンパイルエラーになる。
クラスのメンバ変数の場合:決まった値(デフォルト値)になる。