【精华帖】托管C++/CLI编程:第1部分

2023-12-13 10:51:59

目录

摘要

1、C++ / CLI

2、编写 C++ 代码

3、C++/?CLI “你好,世界!”项目

4、命名空间

5、类(引用类型)

6、方法

7、构造函数

8、值类型

9、属性

10、先决条件

总结


摘要

这篇文章解释了 .NET 公共语言运行时 (CLR) 上下文下 C++/CLI 编程背后的理论和原理。我们将研究 C++/CLI 编程的显着特性,例如它相对于原生 C++ 语言和 CLR 上下文的优势。我们将介绍使用 Visual Studio?IDE 创建和执行 CLR 控制台和其他应用程序原型的基本机制。我们还将探讨 C++/CLI 语言的语义来编写和实现代码。本部分还详细介绍了 CLR C++ 编程原型的各个重要方面,这些方面与硬核面向对象编程相关。

1、C++ / CLI

科学 您可以使用 VC++?开发两种根本不同的 C++ 应用程序。您可以编写在计算机上本机执行的应用程序。这些应用程序由 ISO/ANSI 语言标准定义,称为本机 C++ 程序。还可以编写应用程序,以便在 C++ 和 ECMA 定义的 355 标准的扩展版本(称为 CLR 程序或 C++/CLI 程序)的 CLR 控制下运行。

CLR 是用于执行用各种高级语言(包括 C#、VB 和 C++/CLI)编写的托管程序的环境。公共语言运行时 (CLR) 的规范现在体现在公共语言基础结构 (CLI) 的 ECMA 标准中。这就是为什么 CLR 的 C++ 被称为 C++/CLI 的原因。

CLI 本质上是虚拟机环境(虚拟执行系统 (VES))的规范,它使用其他高级语言编写的应用程序能够在不同的系统环境中执行,而无需重新编译源代码。CLI 为编译高级语言源代码的虚拟机指定标准中间语言(称为 MSIL)。当您执行程序时,MSIL 中的代码最终由 JIT 编译器映射到机器代码。因此,CLI 中间语言中的代码可以在具有 CLI 实现的任何其他环境中执行。

2、编写 C++ 代码

正如我们之前提到的,Windows 应用程序有两个选项;您可以编写使用 CLR 执行的代码,也可以编写直接编译为机器代码并因此本机执行的代码。使用 CLR 执行的 C++ 代码被描述为托管 C++,因为数据和代码由 CLR 管理,例如释放动态分配的用于存储数据的内存。这是自动处理的,从而消除了常见的本机 C++ 错误的来源。在 CLR 外部执行的 C++ 代码称为非托管 C++。

因此,与本机 C++ 相比,C++/CLI 具有巨大的优势,因为使用非托管 C++,您必须在程序执行期间自行处理分配和释放内存的所有方面,并且还需要保护应用程序免受各种安全渗透漏洞的影响。

06ed11fb02d35dd9f578b5f3d8505423.jpeg
C++/CLI 的最大优势是能够将本机代码与托管代码混合使用。您可以扩展现有的本机C++应用程序并添加 .NET 功能,还可以将 .NET 类添加到本机库,以便可以从其他 .NET 语言(如 C# 和 VB)使用它们C++。

3、C++/?CLI “你好,世界!”项目

本节介绍如何使用 Visual Studio?IDE 以 C++/CLI 编程语言创建第一个“Hello World!”程序。尽管这是最简单的逻辑实现,但我们只是尝试通过 CLR 控制台基本应用程序(如另一个基于 C# 控制台的应用程序)显示字符串值。这是这方面的教程过程。

  1. 首先,确保在 Visual Studio?IDE 中正确配置了 VC++ 插件。如果没有,请重新安装软件,并在此过程中选择 VC++ 选项。
    ?

    b5ccb231cd939ef66bd56afeeedfbd5b.jpeg

  2. 打开 Visual Studio?IDE。转到“文件”菜单,选择“新建项目”,您将在对话框左窗格中找到 VC++ 语言插件。
    ?
  3. 展开 VC++ 并选择 CLR。然后,从右窗格中选择“CLR 控制台应用程序”。
    ?
  4. 最后,给项目起一个名字,如“CLI_test”,最后按下OK键,如上图所示。
    ?
  5. 现在,从“解决方案资源管理器”中打开CLI_test.cpp文件,并提供以下代码:
    1. #include?"stdafx.h"??
    2. ??
    3. using?namespace?System;??
    4. ??
    5. int?main(array<System::String?^>?^args)??
    6. {??
    7. ????Console::WriteLine(L"Hello?World");??
    8. ????Console::ReadLine();??
    9. ????return?0;??
    10. ????} ?
  6. 最后,生成项目并在控制台中查看输出。

通过构建控制台应用程序

d79dc76c2199b7794b906ade3f431dea.jpeg
创建文件 C++ / CLI 术语

本部分旨在通过概述基本的各种核心 C++/CLI 结构以及与面向对象编程相关的一些高级实现概念来启动 C++/CLI 编程,例如泛型、异常处理、委托和内存管理,在 CLR 领域使用 C++ 语法。

4、命名空间

.NET 类型组织在一个称为命名空间的特殊容器中。它可以体现任何类型,如类、接口、结构、属性、方法等......如果我们想引用其他程序集,我们需要在标头部分的 using 关键字之后指定 namespace 关键字。我们可以在 C++/CLI 中定义别名,但它们只能引用其他命名空间,而不能引用类。

  1. //?import?reference??
  2. using?namespace?System;??
  3. using?namespace?System::Text;??
  4. ??
  5. //alais??
  6. using?abc=?System::Windows::Forms;??
  7. ??
  8. //?namespace?definition??
  9. namespace?test??
  10. {??
  11. ????namespace?ajay??
  12. ????{??
  13. ????????namespace?champu??
  14. ?????????????{??
  15. ????????????????????//?code……??
  16. ?????????????}??
  17. ????}?????
  18. } ?

最后,我们不能用一个 namespace 语句定义分层命名空间,而是必须嵌套命名空间。

5、类(引用类型)

类在 C++/CLI 中也称为引用类型。在 C++ 中,类和结构具有几乎相同的含义;您不需要像在 C# 中那样区分引用类型和值类型,其中类通常是引用类型,结构是值类型。在 C++ 中,ref 关键字用于定义托管类或结构。

  1. //class?type??
  2. public?ref?class?testClass??
  3. {??
  4. };??
  5. ??
  6. //structure?type??
  7. public?ref?struct?testStruct??
  8. {??
  9. };??
结构和类都用大括号括起来,必须在类声明的末尾指定分号。

当面对引用类型变量时,必须在托管堆上分配其对象。在 C++/CLI 中,我们定义句柄运算符 ^ 以处理引用类型的声明。 gcnew?运算符在托管堆上分配内存。我们可以使用 ?new?关键字在本机堆上分配空间。
  1. //Instantiation??
  2. testClass^?obj=gcnew?testClass();??
  3. ??
  4. testSruct^?obj1=?gcnew?testStruct();??
  5. ??
  6. obj1=?nullptr; ?

我们可以使用类似于 C# null 关键字的 nullptr 关键字从内存中取消引用或删除类型的相应空间。

6、方法

C++/CLI 中的方法声明与 C# 几乎相同,因为它们始终在类中定义。但有一个例外,即访问修饰符不是方法声明的一部分,而是写在方法声明之前。

  1. public?ref?class?testClass??
  2. {??
  3. ??
  4. ???public:??
  5. ???void?hello()??
  6. ???{??
  7. ???}??
  8. }; ?
参数既可以作为值类型传递,也可以作为 C++/CLI 中的引用类型传递。在引用类型的情况下,我们使用与 C# ref 关键字和 C++ & 运算符几乎相同的 % 运算符。
  1. public:??
  2. ??????void?display(int?x)??
  3. ????{??
  4. ????}??
  5. ????????
  6. ???????void?operation(int%?i)??
  7. ????{??
  8. ????}??
  9. …………………??
  10. //Method?calling??
  11. ???????testClass^?xyz;???
  12. ???????testClass^?obj=gcnew?testClass();??
  13. ???????obj.operation(xyz); ?

7、构造函数

C++/CLI 构造函数与类(如 C#)同名。但与方法声明一样,访问修饰符与构造函数分离。

  1. public?ref?class?testClass??
  2. {??
  3. ??
  4. public:??
  5. ????testClass(String^?a)??
  6. ????{??
  7. ????????this->a=a;??
  8. ????}??
  9. private:??
  10. ????String^?a;??
  11. }; ?

8、值类型

为了声明值类型,C++/CLI 在类或结构关键字之前使用 value 关键字。使用值类型,我们可以在堆栈中分配类型空间。

  1. public?value?class?testClass??
  2. {??
  3. } ?
下表提供了 .NET 和 C++ /

CLI 上下文下的预定义值类型列表:
?

6300a5bb18ae9f05d394daa8a37eecab.jpeg

枚举 枚举是使用 C++/CLI 语言中的 enum 关键字定义的。此实现与其他 .NET 语言(如 C#)几乎相同。
  1. public?enum?class?color??
  2. {??
  3. ??????RED,GREEN,BLUE,BLACK??
  4. }; ?

9、属性

C++/CLI 语言使用 property 关键字声明属性,它需要具有 get 访问器的类型,并且必须使用 set 访问器定义变量值。

  1. public?ref?class?testClass??
  2. {??
  3. private:??
  4. ????String^?name;??
  5. ??
  6. public:??
  7. ????property?String^?Name??
  8. ????{??
  9. ????????String^?get()??
  10. ????????{??
  11. ????????????return?name;??
  12. ????????}??
  13. ????????void?set()??
  14. ????????{??
  15. ????????????name=value;??
  16. ????????}??
  17. ????}??
  18. }; ?

10、先决条件

预计程序员必须精通本机 C++ 面向对象编程,并深入了解在 .NET CLR 上下文中构建和执行 C++ 和 C# 应用程序。

总结

本文描述了 C++/CLI 相对于原生 C++ 语言的重要性和优势。我们详细了解了 CLR 上下文下 C++/CLI 的核心剖析。在本文中,我们学习了如何定义各种核心概念的语法,如值类型、引用类型、方法和枚举。这些系列的下一篇文章将解释其余的概念,如接口、继承、多态、循环、数组等。

文章来源:https://blog.csdn.net/m0_51887793/article/details/134891952
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。