C++/CLI
読み:スィープラスプラス-スィーエルアイ
外語:C++/CLI
.NET Framework
用仮想計算機、
共通言語基盤
(CLI)上で動作する、
C++
を拡張したC++の上位互換プログラミング言語。ECMA-372として標準化されている。
目次
概要
特徴
構文
ハンドル
ファイナライザー
概要
それ以前、MicrosoftはC++の独自拡張として「C++マネージ拡張」をVisual Studio .NET 2002から提供した。
これがさらに改訂された結果、独自のプログラミング言語としてC++/CLIがVisual Studio 2005から提供開始となった。これは、Visual C++ 2005以降でコンパイルすることが出来る。
C++の独自拡張だった「C++マネージ拡張」と比較し、より分かりやすい構文が導入され、書きやすさと可読性が向上している。
MicrosoftのC++拡張には他にC#があるが、C#よりはC++に近い。
特徴
構文
C++マネージ拡張は、C++の独自拡張を加えた上位互換仕様だった。マネージ拡張とは、簡単には
ガベージコレクション
機能である。
C++/CLIも同様にC++の上位互換だが、一つのプログラミング言語であり、C++に対し、様々な機能拡張や仕様の変更が行なわれている。
特に顕著な仕様差は、.NETの参照型に関するものである。
ハンドル
旧C++マネージ拡張ではこれはC++のそれと同様にポインターと呼ばれ、C++のポインターを__nogcポインター、.NETの参照型オブジェクトを指すポインターを__gcポインターと呼んだ。ガベージコレクションの有無をそのまま表わしている。
C++/CLIでは、.NETの参照型オブジェクトを指すものをハンドルと呼び、ポインターはC++のもののみとなった。
C++/CLIのハンドルは "クラス名 ^"で表現される。従来のクラスは "クラス名 *" なので、ベージコレクションの有無が分かりやすくなった。
また、
ポインター演算子
の
&
に対してC++/CLIではハンドル演算子の%が用意された。オブジェクトそのものではなく、オブジェクトの参照(ハンドル)を得る必要がある場合、ハンドル演算子%を使用する。
組み合わせて、追跡参照(トラッキング参照)として "^%" という構文も利用できる。
ファイナライザー
デストラクター
はオブジェクトが消滅するときに呼ばれる処理だが、C++/CLIにはこの他にガベージコレクションが存在し、両方が使用される。そこでC++/CLIでは、ガベージコレクション時に呼び出される処理をファイナライザーと呼び分けている。
デストラクターは従来のC++もC++/CLIも~クラス名()だが、C++/CLIのファイナライザーは!クラス名()となる。
旧C++マネージ拡張やC#では、virtual void Finalizeという名前が使われていたが、C++/CLIは新たなプログラミング言語として、仕様が拡張されているのである。
なお、~は
1の補数
演算子
(ビット演算の
論理否定
演算子)、!はその変数等のビット列全体を対象とした論理否定演算子である。
再検索