C++/CX简介
C++/CX是微软为Windows Store和Windows Phone Store应用开发者提供的一种native开发语言,它是C++的一个Extension,也就是说,它是兼容C++的。
从名字可以看出,C++/CX包含了C++,又包含了C++的extension。CX的X表示的意思跟DirectX和ActiveX等技术中的X类似,就是表示C++ extension中的各种技术。
C++/CX不仅兼容ISO C++,也兼容STL。
对于喜欢C++的Native开发者,在Windows Store应用开发或者Windows phone Store应用开发过程中,了解一些C++/CX对于程序的理解还是有帮助的。
需要强调的是C++/CX只是一个wrapper,这个wrapper可以是很薄的,也就是说对于开发者来说,应用绝大多数的代码都可以是标准C++,只有很少一部分是C++/CX的语法。
使用C++/CX和native开发的原因
C++/CX可以和XAML交互,也可以和其他语言如C#和VB等进行交互,而标准C++不可以。所以当我们使用C++开发,同时又需要和XAML或者其他语言交互时,我们就需要使用C++/CX。C++/CX兼容C++。
在Windows开发环境中,可能有些开发者更喜欢C#,或者HTML5+JS。也有些喜欢开发者喜欢native开发,一般有以下几个原因
1. 需要更有效率的程序
2. 有现有的C++/C的代码
3. 更熟悉C++的开发
4. 需要使用DirectX或其他仅支持C++的API. 目前在Windows Store和Windows Phone Store中,DirectX开发只能使用C++。
常用的C++ 11语法
虽然C++ 11有很多新特性,但在Windows商店应用开发时,不可避免会遇到的有下面这些:
1. auto关键字,如下: auto在这里有类型推导的作用,objA自动被判断为ClassA类型。
auto objA = new ClassA();
2. lamda表达式。Java和C#开发者可能很熟悉这一语法,但是很多C++开发者并不熟悉。
3. 空指针nullptr。在C++ 11中nullptr是已经存在的表示空指针的保留关键字,而不需要开发者宏定义一个NULL表示空指针。
4. 各种智能指针如unique_ptr, shared_ptr和weak_ptr
关于C++ 11标准可参考下面的链接
http://msdn.microsoft.com/en-us/library/hh279654.aspx
http://www.codeproject.com/Articles/570638/Ten-Cplusplus11-Features-Every-Cplusplus-Developer
使用C++/CX必须会的语法
1. ref new. 对于Windows RT类型,必须使用ref new来生成对象,如下。ref表示有引用计数,即C++/CX通过引用计数自动的管理对象的生命周期。
auto calendarA = ref new Calendar;
calendarA->SetToNow(); //使用指针方式调用
2. ref class对于自定义的class,如果也希望自动使用引用计数管理对象,则在class定义前加ref,如下:
ref class ClassExample {
...
};
3. ^. 有引用计数的指针的表示方法。如下:
Calendar^ calendarB = ref new Calendar;
calendarB->SetToNow();
(*calendarB).SetToNow(); //此处和标准C++使用方法相同,都是用*
只要理解ref和^,同时会使用ISO C++ 11就可以读懂和使用C++/CX代码了。遇到不熟悉的地方再查。
ref指针点评
ref和^这两个点应该是C++/CX相对于标准C++最大的变化了,对于很多标准C++开发者刚看到的时候不是很习惯。虽然标准C++也有智能指针,但是C++/CX中的ref指针还是有些亮点的,例如:ref指针的size和一个普通指针(raw pointer)的size是一样的,也可跟标准C++一样使用cast。如下。从这两点来说,C++/CX的指针似乎又更接近多年前我们学习的C++指针。
RefChild^ refChild = ref new RefChild();
RefParent^ pParent = refChild; // 以子类对象初始化父类指针
try
{
RefChild^ pChild = dynamic_cast<RefChild^>(pParent);
pChild->MethodFromChild();
}
catch (const std::bad_cast& e)
{
cerr << e.what() << ‘\n‘;
cerr << "这个类型不是子类的\n";
} // 类型安全的,自然的指针
C++/CX引用计数原理示例:
{
auto p1 = ref new RefParent(); // parent对象的引用计数加1,成为1. (parent AddRef())
auto p2 = ref new RefChild(); // child对象的引用计数加1,成为1 (child AddRef())
// parent对象引用计数减1,释放parent对象. (parent Release)
// child对象引用计数加1,成为2 (Child AddRef())
p1 = p2;
// child对象的引用计数减1,成为1 (child Release())
p1 = nullptr;
} // child Release()
先就说这么多吧,欢迎交流指点。