C++超集C++/CLI模块的基本语法

2022-07-04 14:11:41

托管对象的创建和引用

在前文中我们已经演示过创建一个托管对象,对于如下C#代码:

System.Object x = new System.Object();

其在C++/CLI中的等价代码如下:

System::Object^ x = gcnew System::Object();

和传统的C++创建的语法比较下,

P* x = new P();

我们不难发现,对于托管对象,主要引入了如下两个语法:

    用gcnew代替new实现托管对象的创建

    用^代替*实现托管对象的指针

    这种方式创建的对象是可以直接被CLR支持的,可以在C#中使用。托管对象指针使用的方式和传统的对象指针还是比较类似的,直接使用->即可:

    System::Object^ x = gcnew System::Object();
    auto str = x->ToString();

    另外,C++/CLI也有一种类似于C++的对托管对象的引用的语法:

    System::Object^ x = gcnew System::Object();
    System::Object% y = *x;
    auto str = y.ToString();

    由于这种方式在C#里没有对应的语法,用起来感觉怪怪的,也不方便于其它.net语言集成。

    托管类型的定义

    我们也可以自定义托管类型,在CLR中,托管类型是分为引用类型(class)和值类型(struct)的,在C++/CLI中的分别定义方式如下:

    引用类型:

    public ref class MyClass
    {
    };

    值类型:

    public value class MyClass
    {
    };

    在ISO C++中类定义中加上了ref或value标记为托管类型,还算比较容易使用。

    枚举

    枚举的定义和C++11的enum>

    public enum class SomeColors { Red, Yellow, Blue };

    或者更精确的表示:

    public enum class SomeColors : char { Red, Yellow, Blue };

    数组

    C++/CLI中新增了array<T>>

    array<int> ^a = gcnew array<int>(100) { 1, 2, 3 };

    或者使用它的完整版:

    cli::array<int> ^a = gcnew cli::array<int> {1, 2, 3};

    不定参数

    对于C#中的不定参数的语法:

    void foo(params string[] args)

    在C++/CLI中对应的版本为:

    void foo(... array<String^>^ args)

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。