C++言語
日本語 | C++言語 |
英語 | C plus plus language |
ふりがな | しーぷらすぷらすげんご、しーぷらぷらげんご |
フリガナ | シープラスプラスゲンゴ、シープラプラゲンゴ |
プログラミング言語のひとつ。
C言語に「クラス」等のオブジェクト指向的機能を加えた言語。
Javaの源流にあたる言語。「{」「}」といった記号、そして予約語の多くがJavaと共通となっているため、見た目は似ている言語。
JavaのJVMのような「実行環境」は持たず、言語仕様のみ決められている。
古い言語のため、低レベルの機能を持ち、特定のOS専用のアプリケーションを作成することができる。
C++言語はクラスを持つこともあり、Javaと似た言語である。
しかし、異なる点も非常に多い。
・C++言語のcharは1バイトだが、Javaでは2バイトである。
・C++言語のintは未定義だが、Javaでは4バイトである。
・C++言語のlongは4バイトだが、Javaでは8バイトである。
・C++言語ではsignedとunsignedで符号の有無を選択できるが、Javaではchar以外符号あり、charは符号なしに固定されている。
・C++言語のTRUEとFALSEは整数値だが、Javaではtrueとfalseというbooleanリテラルとなる。C++言語のtrueとfalseと同様である。
・C++言語の、if等のステートメントの評価は「0以外」か「0」の判定だが、Javaでは「true」か「false」である。
・C++言語にはグローバル変数があるが、Javaにはない。Javaではstaticフィールドで代替する。
・C++言語には関数があるが、Javaにはない。Javaではstaticメソッドで代替する。
・C++言語にはプリプロセッサがあるが、Javaにはない。機能によってはJavaでは代替不可能である。
・C++言語のgotoは、Javaでは機能しない。使用するとコンパイルエラーになる。
・C++言語の文字列は配列を用いるが、JavaではStringクラスを用い、文字コードはUnicodeに固定される。
・C++言語の文字列リテラルは先頭文字のアドレスを返すが、JavaではStringクラスを自動生成しその中に格納する。
・C++言語の文字列リテラルには連結機能を持たないが、JavaはStringクラスのみ+演算子等によって連結を行うことができる。
・C++言語のポインタは、Javaでは参照に当たる。
・C++言語のアドレスは、Javaでは存在しない。Javaではアドレスを直接操作することはできない。代替として参照値があるが、C++言語のアドレスとは大きく異なる。少なくとも整数値ではない。
・C++言語のNULLは整数の0だが、Javaではリテラルであり、参照型変数にのみ格納できる。
・C++言語ではポインタと配列はほぼ同じものだが、Javaの参照と配列はまったく異なる。
・C++言語の配列は、Javaではインスタンスを作成する必要がある。
・C++言語の配列は先頭要素のアドレスを返すが、Javaの配列はインスタンスの参照値を返す。
・C++言語の参照は、Javaには存在しない。
・C++言語ではクラスを通常の変数として宣言できるが、Javaでは参照型変数しか宣言できず、インスタンスを作らなければならない。
・C++言語ではクラスをポインタや参照を通して使用したときのみポリモーフィズムされるが、Javaでは常に参照を用いるため常にポリモーフィズムが行われる。
・C++言語では、メンバ関数にvirtualを付けなければオーバーライドしてもポリモーフィズムされないが、Javaでは常にオーバーライドしたメソッドはポリモーフィズムの機能を持つ。
・C++言語の、classの前に置いたpublic等のアクセスコントロール用予約語は、サブクラスのメンバのアクセスコントロールを指定するものだが、Javaではクラスそのもののアクセスコントロールを行うものであるため、まったく異なる機能となる。
・C++言語では各メンバのアクセスコントロールは「アクセスコントロール用予約語が書かれた箇所以下」を指定するが、Javaではフィールド・メソッドひとつずつにアクセスコントロールを指定する。
・C++言語ではクラスのデフォルトのアクセスコントロールはprivateだが、Javaでは「無印」という特別なアクセスコントロールである。
・C++言語のprotectedは「サブクラスのみ」だが、Javaでは「パッケージ内+サブクラス」である。
・C++言語ではクラスの定義の最後にセミコロン(「;」)が必要だが、Javaでは必要ない。
・C++言語では演算子をオーバーロードできるが、Javaではできない。通常のメソッドを用いる必要がある。
・C++言語のconstメンバ関数は、Javaにはない。
・C++言語には、削除されるときに呼び出される「デストラクタ」というメンバ関数があるが、Javaにはない。Javaのクラスはガベージコレクションによって削除されるため、デストラクタがあったとしてもいつ呼び出されるか分からないためである。
・C++言語のconstポインタは、Javaにはない。正確には「char *const」のようなconstはfinalで代用できるが、「const char *」のconstはJavaにはない。
・C++言語では通常のキャストもしくはstatic_castで好きなキャストが行えたが、Javaでは好きには行えない。クラスの継承関係が一致していない場合や、参照値を整数値に、といった無理なキャストは行えない。
・C++言語ではnewで作成したインスタンスはdeleteで削除する必要があるが、Javaではガベージコレクションによって自動的に削除される。
・C++言語では通常の変数と配列とでnew及びdeleteの使用方法が異なるが、Javaでは同じである。
・C++言語では基本型(プリミティブ型)もnewでインスタンスを作成できるが、Javaではクラスと配列のみで、プリミティブ型のインスタンスは作成できない。
・C++言語にも例外処理があるが、Javaに比べて機能は極端に劣る。
・C++言語の名前空間は、Javaのパッケージに当たる。
・C++言語はヘッダーファイル(.h)とソースファイル(.cpp)の2つのファイルにプログラムを記述するが、Javaではソースファイル(.java)のみである。
・C++言語ではクラスの定義とメンバ関数の宣言をヘッダーファイルで行い、メンバ関数の実装をソースファイルで行うが、Javaでは全てソースファイルのみで行う。これはC++言語のインライン関数を用いた記法に似たものである。
・C++言語のincludeは単に「ヘッダーファイルを指定した箇所に置き換える」ことだが、Javaのimportは指定したクラスをパッケージの指定なしに使用するためのものであり、似ているが根本的に異なるものである。
・C++言語の標準ライブラリは「Cランタイムライブラリ」のみであり、これすらも言語仕様とは独立しているが、Javaの標準ライブラリJ2SEは多機能であり、言語仕様と深く融合している。
ざっと上げただけでもこれだけ異なる。
C++言語はJavaに似ているが、そもそもC++言語はC言語の機能拡張版であり、プログラムの多くは古いC言語のスタイルに則ったものが多い。
もし、C++言語のプログラムをJavaプログラムにリプレースする場合には、単に置き換えず、両方の言語を熟知している人間が再設計することが望ましい。
C言語に「クラス」等のオブジェクト指向的機能を加えた言語。
Javaの源流にあたる言語。「{」「}」といった記号、そして予約語の多くがJavaと共通となっているため、見た目は似ている言語。
JavaのJVMのような「実行環境」は持たず、言語仕様のみ決められている。
古い言語のため、低レベルの機能を持ち、特定のOS専用のアプリケーションを作成することができる。
C++言語はクラスを持つこともあり、Javaと似た言語である。
しかし、異なる点も非常に多い。
・C++言語のcharは1バイトだが、Javaでは2バイトである。
・C++言語のintは未定義だが、Javaでは4バイトである。
・C++言語のlongは4バイトだが、Javaでは8バイトである。
・C++言語ではsignedとunsignedで符号の有無を選択できるが、Javaではchar以外符号あり、charは符号なしに固定されている。
・C++言語のTRUEとFALSEは整数値だが、Javaではtrueとfalseというbooleanリテラルとなる。C++言語のtrueとfalseと同様である。
・C++言語の、if等のステートメントの評価は「0以外」か「0」の判定だが、Javaでは「true」か「false」である。
・C++言語にはグローバル変数があるが、Javaにはない。Javaではstaticフィールドで代替する。
・C++言語には関数があるが、Javaにはない。Javaではstaticメソッドで代替する。
・C++言語にはプリプロセッサがあるが、Javaにはない。機能によってはJavaでは代替不可能である。
・C++言語のgotoは、Javaでは機能しない。使用するとコンパイルエラーになる。
・C++言語の文字列は配列を用いるが、JavaではStringクラスを用い、文字コードはUnicodeに固定される。
・C++言語の文字列リテラルは先頭文字のアドレスを返すが、JavaではStringクラスを自動生成しその中に格納する。
・C++言語の文字列リテラルには連結機能を持たないが、JavaはStringクラスのみ+演算子等によって連結を行うことができる。
・C++言語のポインタは、Javaでは参照に当たる。
・C++言語のアドレスは、Javaでは存在しない。Javaではアドレスを直接操作することはできない。代替として参照値があるが、C++言語のアドレスとは大きく異なる。少なくとも整数値ではない。
・C++言語のNULLは整数の0だが、Javaではリテラルであり、参照型変数にのみ格納できる。
・C++言語ではポインタと配列はほぼ同じものだが、Javaの参照と配列はまったく異なる。
・C++言語の配列は、Javaではインスタンスを作成する必要がある。
・C++言語の配列は先頭要素のアドレスを返すが、Javaの配列はインスタンスの参照値を返す。
・C++言語の参照は、Javaには存在しない。
・C++言語ではクラスを通常の変数として宣言できるが、Javaでは参照型変数しか宣言できず、インスタンスを作らなければならない。
・C++言語ではクラスをポインタや参照を通して使用したときのみポリモーフィズムされるが、Javaでは常に参照を用いるため常にポリモーフィズムが行われる。
・C++言語では、メンバ関数にvirtualを付けなければオーバーライドしてもポリモーフィズムされないが、Javaでは常にオーバーライドしたメソッドはポリモーフィズムの機能を持つ。
・C++言語の、classの前に置いたpublic等のアクセスコントロール用予約語は、サブクラスのメンバのアクセスコントロールを指定するものだが、Javaではクラスそのもののアクセスコントロールを行うものであるため、まったく異なる機能となる。
・C++言語では各メンバのアクセスコントロールは「アクセスコントロール用予約語が書かれた箇所以下」を指定するが、Javaではフィールド・メソッドひとつずつにアクセスコントロールを指定する。
・C++言語ではクラスのデフォルトのアクセスコントロールはprivateだが、Javaでは「無印」という特別なアクセスコントロールである。
・C++言語のprotectedは「サブクラスのみ」だが、Javaでは「パッケージ内+サブクラス」である。
・C++言語ではクラスの定義の最後にセミコロン(「;」)が必要だが、Javaでは必要ない。
・C++言語では演算子をオーバーロードできるが、Javaではできない。通常のメソッドを用いる必要がある。
・C++言語のconstメンバ関数は、Javaにはない。
・C++言語には、削除されるときに呼び出される「デストラクタ」というメンバ関数があるが、Javaにはない。Javaのクラスはガベージコレクションによって削除されるため、デストラクタがあったとしてもいつ呼び出されるか分からないためである。
・C++言語のconstポインタは、Javaにはない。正確には「char *const」のようなconstはfinalで代用できるが、「const char *」のconstはJavaにはない。
・C++言語では通常のキャストもしくはstatic_castで好きなキャストが行えたが、Javaでは好きには行えない。クラスの継承関係が一致していない場合や、参照値を整数値に、といった無理なキャストは行えない。
・C++言語ではnewで作成したインスタンスはdeleteで削除する必要があるが、Javaではガベージコレクションによって自動的に削除される。
・C++言語では通常の変数と配列とでnew及びdeleteの使用方法が異なるが、Javaでは同じである。
・C++言語では基本型(プリミティブ型)もnewでインスタンスを作成できるが、Javaではクラスと配列のみで、プリミティブ型のインスタンスは作成できない。
・C++言語にも例外処理があるが、Javaに比べて機能は極端に劣る。
・C++言語の名前空間は、Javaのパッケージに当たる。
・C++言語はヘッダーファイル(.h)とソースファイル(.cpp)の2つのファイルにプログラムを記述するが、Javaではソースファイル(.java)のみである。
・C++言語ではクラスの定義とメンバ関数の宣言をヘッダーファイルで行い、メンバ関数の実装をソースファイルで行うが、Javaでは全てソースファイルのみで行う。これはC++言語のインライン関数を用いた記法に似たものである。
・C++言語のincludeは単に「ヘッダーファイルを指定した箇所に置き換える」ことだが、Javaのimportは指定したクラスをパッケージの指定なしに使用するためのものであり、似ているが根本的に異なるものである。
・C++言語の標準ライブラリは「Cランタイムライブラリ」のみであり、これすらも言語仕様とは独立しているが、Javaの標準ライブラリJ2SEは多機能であり、言語仕様と深く融合している。
ざっと上げただけでもこれだけ異なる。
C++言語はJavaに似ているが、そもそもC++言語はC言語の機能拡張版であり、プログラムの多くは古いC言語のスタイルに則ったものが多い。
もし、C++言語のプログラムをJavaプログラムにリプレースする場合には、単に置き換えず、両方の言語を熟知している人間が再設計することが望ましい。
参考サイト
- (参考サイトはありません)
// 一般的なC++言語のプログラム。
// Data.h
// 二重読み込み防止用のプリプロセッサマクロ。
#if !defined(__Data_h__)
#define __Data_h__
// 同じく二重読み込み防止用のプリプロセッサマクロ。
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CDataクラスの定義。
class CData
{
private:
// アクセスコントロール「private」。
// ここから、次のアクセスコントロールまでのメンバは
// privateになります。
// メンバ変数。
int m_iValue;
public:
// アクセスコントロール「public」。
// ここから、次のアクセスコントロールまでのメンバは
// publicになります。
// コンストラクタの宣言。
CData();
// デストラクタの宣言。
virtual ~CData();
// getterメソッドの宣言。
int GetValue();
// setterメソッドの宣言。
void SetValue( int p_i );
};
#endif // !defined(__Data_h__)
// Data.cpp
#include <stdio.h>
#include "Data.h"
// コンストラクタ。
CData::CData()
{
printf( "コンストラクタが呼ばれました。\n" );
}
// デストラクタ。
CData::~CData()
{
printf( "デストラクタが呼ばれました。\n" );
}
// getter。
int CData::GetValue()
{
return m_iValue;
}
// setter。
void CData::SetValue( int p_i )
{
m_iValue = p_i;
}
// Main.cpp
#include <stdio.h>
#include "Data.h"
// この関数が最初に呼ばれます。
int main(int argc, char* argv[])
{
// CDataクラスの変数を宣言します。
// newは必要ありません。
CData cData;
// コンストラクタが呼ばれました。
// setter/getterを使用します。
cData.SetValue( 100 );
printf( "%d\n", cData.GetValue() );
// 100
return 0;
// デストラクタが呼ばれました。
}
// Data.h
// 二重読み込み防止用のプリプロセッサマクロ。
#if !defined(__Data_h__)
#define __Data_h__
// 同じく二重読み込み防止用のプリプロセッサマクロ。
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CDataクラスの定義。
class CData
{
private:
// アクセスコントロール「private」。
// ここから、次のアクセスコントロールまでのメンバは
// privateになります。
// メンバ変数。
int m_iValue;
public:
// アクセスコントロール「public」。
// ここから、次のアクセスコントロールまでのメンバは
// publicになります。
// コンストラクタの宣言。
CData();
// デストラクタの宣言。
virtual ~CData();
// getterメソッドの宣言。
int GetValue();
// setterメソッドの宣言。
void SetValue( int p_i );
};
#endif // !defined(__Data_h__)
// Data.cpp
#include <stdio.h>
#include "Data.h"
// コンストラクタ。
CData::CData()
{
printf( "コンストラクタが呼ばれました。\n" );
}
// デストラクタ。
CData::~CData()
{
printf( "デストラクタが呼ばれました。\n" );
}
// getter。
int CData::GetValue()
{
return m_iValue;
}
// setter。
void CData::SetValue( int p_i )
{
m_iValue = p_i;
}
// Main.cpp
#include <stdio.h>
#include "Data.h"
// この関数が最初に呼ばれます。
int main(int argc, char* argv[])
{
// CDataクラスの変数を宣言します。
// newは必要ありません。
CData cData;
// コンストラクタが呼ばれました。
// setter/getterを使用します。
cData.SetValue( 100 );
printf( "%d\n", cData.GetValue() );
// 100
return 0;
// デストラクタが呼ばれました。
}
// 一般的なC++言語のプログラム。 // Data.h // 二重読み込み防止用のプリプロセッサマクロ。 #if !defined(__Data_h__) #define __Data_h__ // 同じく二重読み込み防止用のプリプロセッサマクロ。 #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // CDataクラスの定義。 class CData { private: // アクセスコントロール「private」。 // ここから、次のアクセスコントロールまでのメンバは // privateになります。 // メンバ変数。 int m_iValue; public: // アクセスコントロール「public」。 // ここから、次のアクセスコントロールまでのメンバは // publicになります。 // コンストラクタの宣言。 CData(); // デストラクタの宣言。 virtual ~CData(); // getterメソッドの宣言。 int GetValue(); // setterメソッドの宣言。 void SetValue( int p_i ); }; #endif // !defined(__Data_h__) // Data.cpp #include <stdio.h> #include "Data.h" // コンストラクタ。 CData::CData() { printf( "コンストラクタが呼ばれました。\n" ); } // デストラクタ。 CData::~CData() { printf( "デストラクタが呼ばれました。\n" ); } // getter。 int CData::GetValue() { return m_iValue; } // setter。 void CData::SetValue( int p_i ) { m_iValue = p_i; } // Main.cpp #include <stdio.h> #include "Data.h" // この関数が最初に呼ばれます。 int main(int argc, char* argv[]) { // CDataクラスの変数を宣言します。 // newは必要ありません。 CData cData; // コンストラクタが呼ばれました。 // setter/getterを使用します。 cData.SetValue( 100 ); printf( "%d\n", cData.GetValue() ); // 100 return 0; // デストラクタが呼ばれました。 }