C ++ / CLI 语法

Posted jshchg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ / CLI 语法相关的知识,希望对你有一定的参考价值。

1、Handles and Pointers

您可能已经在C ++ / CLI代码中看到标点符号“ ^”并对此感到疑惑。如您所知,在C ++中,表示指针,在C ++ / CLI中,表示句柄。现在,“ *”指定驻留在CRT堆上的本机指针,而句柄则指定“安全指针”并驻留在托管堆上。可以将这些句柄视为引用,并且与本机指针不同,如果未正确删除它们,它们将不会引起内存泄漏,因为GC会处理这些问题,并且它们没有固定的内存地址,因此将在执行过程中移动。

要创建某个特定类或值类型的新引用,我们必须使用“ gcnew”关键字进行分配;例如:

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

 

值得注意的是,nullptr关键字“ ”表示空引用。除了标点符号“ ^”外,我们还有百分比“ %”代表跟踪参考;我想引用ECMA-372:

N* pn = new N;   // allocate on native heap
N& rn = *pn;     // bind ordinary reference to native object
R^ hr = gcnew R; // allocate on CLI heap
R% rr = *hr;     // bind tracking reference to gc-lvalue

 

在一般情况下,加标点%^因为加标点&*

2、Classes and UDTs (user defined types)

注意:在public后面跟着ref关键字

public ref class MyClass
{
private:
public:
  MyClass()
  {

  }
}
#using <mscorlib.dll>

using namespace System;

public ref class MyNamesSplitterClass
{
private:
  System::String ^_FName, ^_LName;
public:
  MyNamesSplitterClass(System::String ^FullName)
  {
    int pos = FullName->IndexOf(" ");
    if (pos < 0)
      throw gcnew System::Exception("Invalid full name!");
    _FName = FullName->Substring(0, pos);
    _LName = FullName->Substring(pos+1, FullName->Length - pos -1);
  }

  void Print()
  {
    Console::WriteLine("First name: {0}
LastName: {1}", _FName, _LName);
  }
};

int main(array<System::String ^> ^args)
{
  // local copy

  MyNamesSplitterClass s("John Doe");
  s.Print();

  // managed heap

  MyNamesSplitterClass ^ms = gcnew MyNamesSplitterClass("Managed C++");
  ms->Print();

  return 0;
}

Value types

 

以上是关于C ++ / CLI 语法的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段4——cli的终端命令大全

C ++ / CLI 语法

C ++ / CLI 语法

C++ /CLI 和 C++ 的区别?

JSP 基础语法

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器