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の補数演算子(ビット演算の論理否定演算子)、!はその変数等のビット列全体を対象とした論理否定演算子である。

再検索