ホーム > 読んだ

渡邊誠人
新機能から理解する
C++/CLI 研究

C++/CLI は VC2003 でのマネージ拡張を更に推し進めたものである。そのため .net Framework プログラミングにおける C++ 言語拡張といってしまえばそれまでとなるが、C++/CLI では C# と並び標準化をも意識している──正しくはマネージ拡張の標準化作業版が C++/CLI なのだということである。C++ の拡張性を維持したまま Java などの便利な点を取り込んだといってしまっては乱暴か。しかし、GC、interface、Generic (= template)、finally キーワードなどは Java と同様である。これ以外では列挙型クラス/構造体、イベントハンドラ/オーバーライド専用を含む新しいキーワード(予約語)などが含まれている。

かくいう私もマネージ拡張や C# は MS だけのプロプライエタリな技術としか思っていなかった。しかし、C++/CLI は現状の肥大化した C++ に対する目指すべきひとつの方向性だと思う。コンピュータの歴史においては、基本的に複雑化しすぎたもの(学習曲線のきつくなり過ぎたもの)は延命できないという定理(というのはいいすぎかもしれないが)がある。プログラミング言語として最もつぶしの効くのが C++ だと信じる私としては、この動きは素直に歓迎したいと思う。

ちなみに VS2005 Express Editon が無償で DL 可能になっているが、以下の内容を実際に走らせてまではいない。私が基本的に VC よりも BCB 使いということもあるが、MFC/ATL を含まないため別途 Platform SDK が必要であるなど、手順が面倒そうなためである。

2007.2.9 補足

念のため補足しておくと C++/CLI は、あくまでも .net Framework に対する C++ 用インタフェースであるため、あくまでも実行は CLR を介して行われる。そのためパフォーマンスは期待できない。

抄録

47-48

ref 修飾子を付与してクラスや構造体を宣言するとガベージコレクション(GC)の対象となる。GC の対象となったオブジェクトは明示的な delete が不要で、new の代わりに gcnew を使う。ガベージコレクションはオブジェクトがスコープを抜けた時点で行われ、もちろんデストラクタも呼び出される。また、GC 使用を明示するために handle 型であることを示す ^ (ハット)をポインタ型の * (アスタリスク)のように使用する。逆に値を直接含むリファレンスでない型(GC の不要な型)であることを明示したい場合は value を付与する。

// ref
ref class X  // GC 対象クラス
{
public:
    int i;
    int getX(){return i;}
};

int main()
{
    X^ px;  // handle型
    px = gcnew X;  // インスタンスの生成
    px->i = 100;
    int x = px->getX();
}
// value
#include "stdafx.h"
using namespace System;

value struct V  // GC 不要の型
{
    int i;
}

int _tmain()
{