C++/CX (Visual C++ Component Extensions,Visual C++ 組件擴展) 是微軟的C++編譯器對C++的擴展,使得程式設計師可以比較方便地編寫面向Windows Runtime(WinRT)的程序。這個語言規範引入了一系列語法和類庫抽象,以對C++程式設計師來說比較自然的方式暴露了基於組件對象模型(COM)的WinRT編程范型的接口。

這個語言擴展從C++/CLI借用了語法,但是是面向WinRT和原生碼而不是通用語言運行庫託管代碼

擴展語法

C++/CX為WinRT編程引入了新的語法。和平台獨立的語法和C++11標準兼容。

物件 (Objects)

WinRT物件的創建方式是通過ref new關鍵字,並賦值給具有^(帽子)註記的類型的變量,這個帽子標記是繼承自C++/CLI。

Foo^ foo = ref new Foo();

一個WinRT變量僅僅是一對指針,一個指向虛函數表(Virtual method table頁面存檔備份,存於互聯網檔案館)),另一個指向物件的內部數據(Opaque pointer頁面存檔備份,存於互聯網檔案館))。

引用計數 (Reference counting)

一個WinRT物件是使用引用計數模式來維護其生命期的,處理方式類似於被智能指針封裝的常規C++物件。物件在沒有引用時銷毀。儘管沒有垃圾回收機制,但是語言規範也保留了gcnew關鍵字以備以後使用。

類型 (Classes)

運行類型 (Runtime classes)

運行類型包含了元件擴展的建構函式。這類型也被簡單地稱為 ref classes,因為它們是用 ref class 創建的。

public ref class MyClass
{

};
局部類型 (Partial classes)

C++/CX引入了局部類型的概念。這個特性使得一個類的定義可以被分離到多個文件,使得XAML圖形用戶界面設計工具能夠自動生成部分代碼到一個單獨的文件,以避免干擾程式設計師寫的代碼。這些局部類型在編譯時合併。這個特性在類似C#之類的CLI語言中已經存在很多年。局部類型並未成為C++標準,所以並不能在純C++11代碼中使用。

這裏是一個設計工具生成的局部類型示例:

// foo.private.h
#pragma once

partial ref class foo
{
private:
   int id_;
   Platform::String^ name_;
};

這裏是一個程式設計師編寫的類示例。生成的局部類型在開頭被導入,注意這裏partial關鍵字不是必要的:

// foo.public.h
#pragma once
#include "foo.private.h"

ref class foo
{
public:
   int GetId();
   Platform::String^ GetName();
};

這是局部類型的實現部分代碼的示例:

// foo.cpp
#include "pch.h"
#include "foo.public.h"

int foo::GetId() {return id_;}
Platform::String^ foo::GetName {return name_;}

泛型 (Generics)

WinRT支持泛型,所以C++/CX也支持。泛型類的信息被保留在元數據內,在運行時才實例化,而不是像C++模板那樣在編譯時示例化。編譯器支持在一個類型中同時使用泛型和模板。

泛型類示例:

generic<typename T> 

public ref class bag 
{
     property T Item;
};

元數據 (Metadata)


所有WinRT程序都通過元數據來描述其中的類型。元數據的格式和通用語言架構(CLI)為.NET Framework規定的標準一致。這個特性使得C++/CX、CLI語言和Javascript的代碼可以互相引用。

運行庫 (Runtime library)

C++/CX有一系列針對WinRT的代碼庫,幫助C++程式設計師將使用C++標準程式庫的代碼移植到WinRT.