C++/CLI 教程
《Visual C++/CLI 从入门到精通》 笔记
什么是C++/CLI
C++/CLI是C++和 .Net Framework 平台版本,它对标准C++进行了一些修改。标准C++允许的一些操作在C++/CLI中是不允许的(例如不能从多个基类继承),并进行了一些修改以支持.NET功能(例如接口和属性)以及兼容.Net运行时。
选择C++/CLI有两个重要理由。首先是互操作性,C++/CLI简化了将标准C++代码集成到.NET项目的步骤。其次是现在有了C++标准模板库(STL)的.NET版本,熟悉STL编码的人很容易迁移到.NET。
定义托管类
1 | ref class Animal |
ref关键字用于简化与 .NET Framework 组件的交互。在class关键字前添加ref,类就成了托管类。实例化对象时,会在“公共语言运行时”(CLR)堆上创建对象。对象的生存期由 .NET Framework 的垃圾回收器管理。
也可以定义非托管类,即不加ref关键字。
创建托管类对象
1 | Animal cat, dog; |
句柄
在C++/CLI中,是“运行时”帮你管理内存,C++/CLI没有了传统的“指针概念”。相反是用句柄来包含变量的地址。使用gcnew操作符动态创建对象。
定义一个指向Animal对象的句柄:
1 | Animal ^dog = gcnew Animal; |
数组
1 | array<int> ^arr = gcnew array<int>(10); |
String 类型
String类不是像int或long那样的内建类型,它是 .NET Framework 的一部分,在System命名空间中。为了使用String,要在源代码文件顶部添加这一行语句:
1 | using namespace System; |
String类的一些成员函数(比如Insert和Replace)表面上能修改字符串,但实际上是返回一个新String对象,其中包含修改好的内容。如需反复修改字符串,应该使用StringBuilder类(添加using namespace System::Text;来使用)。
使用DLL中的定义的托管类数据
1 |
跟踪引用
1 | int i = 5; |
继承
1 | ref class MyDerivedClass : MyBaseClass |
C++/CLI(和其他所有.NET语言)只支持公共继承,所以不需要使用public关键字。用了不会出错,但要记住它是多余的。
如果不指定基类,默认从System::Object派生。
子类重写基类函数必须使用override关键字。
使用非托管代码
1 | ref class ManagedClass |
1 | ref class ManagedClass |