番外編1 C++とC#の違い

要望があったのと、興味がわいたので調べてみました。
HELPに丁度いい項目があったので、それに説明を付加してみました。
「Visual C# Express->VisualC#への移行->C++経験者がC#で開発する場合」
を、参照のこと。
私はC#に関しての知識は殆ど無いので、間違ってたら教えてください(HELP見て調べた
だけですからねぃ)

  • 継承
C++では複数のクラス基本クラスから継承を行えますが、C#では一つの基本クラスからし
か継承できません。
但し、インターフェースは複数実装できます。
インターフェースというのは聞きなれないかもしれませんが、C++で言うと純粋仮想関数
のみで構成されるクラスのようなものです。
関数の再定義前提のクラス、ですね。

  • 構造体とクラス
C++ではクラスと構造体の違いがありませんでしたが、C#の構造体は以下の点が異なりま
す。
1.C#の構造体は値型ですが、クラスは参照型です。
2.構造体は継承が出来ません。但し、インターフェースは複数実装できます。
3.構造体はコンストラクタとデストラクタを実装できません。

  • 配列
C++での配列はポインタですが、C#はオブジェクトです。
メソッドやプロパティを持っており、例えばLengthプロパティで配列の長さを取得でき
たり、Initializeメソッドで各要素を初期化できます。

  • ブール型
前にも説明しましたが、C++でのboolは整数値ですが、C#ではオブジェクトです。
整数型への変換はできません。

  • long 型
HELPには「C++のlongは32Bitだが、C#では64Bitです」とありますが、型のBit長は使っ
ている環境によって変わるので、正確を期するなら32Bit Windows環境でのVC++では
longは32Bitだが……となるのですかね。

  • パラメータを渡す方法
C++では明示的に参照やポインタを渡さなければ全て値で渡しますが、C#ではクラスは
参照で、構造体はout/refを指定すれば参照で、指定しなければ値で渡されます。
out/refはC++でいうところの&による参照渡し指定みたいなものです。
変数も構造体なので基本は値渡し、つまりコピーを作って渡します。
ちなみに、refは変数の初期化が必要な参照渡し、outは初期化が不要な参照渡しです。

  • switch
C++では、caseラベル中にbrakeを記述しなければ、その下のcaseラベルの処理を実行し
ましたが(フォールスルーというらしい)、C#ではそれが許されていません。
どうしてもやりたい場合は、goto分で明示的にジャンプさせる必要があります。
そういや、Cではgoto不要論なんてものがありましたが、C#では違うようですね(嘘)

  • デリゲート
C#には、デリゲートというメソッドを参照する型が追加されています。
C/C++でいう関数ポインタですが、オブジェクトなので安全だし、色々な機能が使えま
す。
例えば、実行する関数を+で足したり、-で引いたりすることが出来ます。
つまり、複数の関数を一つのデリゲートで実行できたりします。

  • オーバーライド
C++ではオーバーライドは暗黙的に行っていましたが、C#ではvirtual/overrideキー
ワードを使い、明示的に行う必要があります。
また、基本クラスのメンバを呼び出す際は、baseキーワードを使います。
C++だと、スコープ演算子とか使って呼び出していましたね。

  • メソッドの隠ぺい
隠蔽というのは、派生先で、基本クラスと同じ名前のメンバを使用することです。
C++でも隠蔽は暗黙的に行われていましたが、C#ではnew修飾子を使用して、明示的に隠
蔽を行う必要があります。
一応newつけなくても隠蔽は出来るのですが、警告が発生します。

  • 条件付コンパイル
条件付きコンパイルには、プリプロセッサ ディレクティブを使用します。
プリプロセッサディレクティブは、プリプロセッサと同様に記述できます。
ここはあまり気にしなくて良いでしょう。

  • 例外処理
C++では、例外処理で、例外がスローしたしないに関わらず行う処理を、tryブロックの
外に記述していましたが、C#では例外がスローするしないに関わらず実行する為の
finalyキーワードが追加されています。

  • C# の演算子
論演算(&,|,^))に、bool型の論理演算機能が追加されています。true & trueでtrue、
true | false でtrueのように、計算されます。
また、オブジェクトと型の互換性を調べるis、オブジェクトのタイプを得るtypeof演算子
が追加されています。

  • extern キーワード
C#でexternは、主にインポートされたDLLのメソッドを使用する際に使用されます。

  • static キーワード
C#では、クラスのメンバにのみstaticキーワードを使用できます。
C/C++のように、ローカル変数にstaticキーワードを使用することは出来ません。

  • Mainメソッド
以下の点が違います。
1.C/C++と違い、先頭が大文字になっています(Main)。
2.常にstaticです
3.コマンドラインの引数は0から初めのコマンドとして読み取ることが出来ます。
4.引数の数は配列なのでLengthプロパティを参照すれば取得できます。

  • ポインタ
C#でもポインタは使用できますが、unsafeモードのときのみ使用できます。
ですがまぁ、ポインタを使うケースというのはあまり無いでしょう。

  • 演算子のオーバーロード
C#では、演算子をオーバーロードする方法が異なります。
例えば、C++ではニ項演算子をオーバーロードする際、左辺は暗黙的にthisポインタを
使用してアクセスする為、引数は一つでした。
C#では二つの引数を持ちます。

  • 文字列
C/C++の文字列とは異なり、C#の文字列は、検索などのメソッドをもつオブジェクトです。
C/C++はchar型の配列ですから、正確な意味での文字列ってのは無いのですけど。
まぁ、C++なら、STLを使えばちゃんとした文字列(std::string)がサポートされていまし
たけどね。

  • foreach キーワード
これは既に説明しました。
配列/コレクション用の反復処理が追加されています。

  • グローバル
C++での悪(?)、グローバル関数/変数がサポートされていません。
全てclass/structに含めなくてはいけません。
まぁ、これはオブジェクト指向型言語としては当たり前でしょうか。

  • 型のインポート
C++では複数のモジュールで使用する共通の型はヘッダファイルに記述していましたが、
C#ではメタデータを使用します。

  • ローカル変数
C#では、ローカル変数を使用する前に、初期化する必要があります。
って、C++でも初期化しないと使い物にならないのは一緒ですが、C#ではコンパイルエ
ラーになります。

  • メモリ管理
C#では、ガベージコレクションを行ってくれる言語です。
C++では、確保したメモリは開放しなければなりませんでした。
まぁ、C++ユーザーとしては多少不安な部分も無くはないのですが、任せられる部分は任
せてしまったほうが良いですかね。

  • デストラクタ
アンマネージリソースを明示的に解放する場合、C#ではDisponseメソッドを使用しますが、
C++ではFinalizeメソッドを使用します。
というか、C++ではDIsponseメソッドが使用できません。
まぁ、これはC++とC#の違いというよりも、Framework上でのお話ですね。

  • コンストラクタ
コンストラクタを指定しない場合、規定のコンストラクタを生成します。
規定のコンストラクタでは全てのフィールドを規定値にて初期化します。

  • ビットフィールド
C#ではビットフィールドが使えません。

  • 入出力
C# の入出力サービスおよび書式指定は、.NET Framework のランタイム ライブラリに依
存します。
C++との違いというか、使うランタイムライブラリの違いですね、これは。
C/C++でも、標準のランタイムライブラリがちがって、書式が違いますしねぇ。

  • メソッドのパラメータの規定値
C++にあった、デフォルト引数がC#では使えなくなっています。
どーしてもやりたい場合はメソッドのオーバーロードを使って実現します。
void func(){func(100);}
void func(int i){}
みたいに。
ものすごく微妙な感じがしますが。

  • ジェネリック
C++のクラス/関数テンプレートの変わりにジェネリックという概念が導入されています。
型指定に<>を使うあたりがテンプレートに似ていますかね。

  • as キーワード
型変換に失敗したときにnullを返すasキーワードが追加されています。
なんか、C++のstatic_castに似ている、っていう説明文がHELPにあったけれど、
static_castってnull返したっけっか??
返さなかったような気がする……てか、null返すのdynamic_castだけだったと思った。
ま、とにかく、例外投げたいときはキャスト、投げたくないときはasキーワードを使う
と覚えておきましょう。
まぁ、型変換に失敗するのって、実行時情報の無いダウンキャストを行ったときくらい
でしょうけど。
最終更新:2007年10月09日 13:24
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。