【精华帖】托管C++/CLI编程:第1部分
目录
摘要
这篇文章解释了 .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++,您必须在程序执行期间自行处理分配和释放内存的所有方面,并且还需要保护应用程序免受各种安全渗透漏洞的影响。
C++/CLI 的最大优势是能够将本机代码与托管代码混合使用。您可以扩展现有的本机C++应用程序并添加 .NET 功能,还可以将 .NET 类添加到本机库,以便可以从其他 .NET 语言(如 C# 和 VB)使用它们C++。
3、C++/?CLI “你好,世界!”项目
本节介绍如何使用 Visual Studio?IDE 以 C++/CLI 编程语言创建第一个“Hello World!”程序。尽管这是最简单的逻辑实现,但我们只是尝试通过 CLR 控制台基本应用程序(如另一个基于 C# 控制台的应用程序)显示字符串值。这是这方面的教程过程。
- 首先,确保在 Visual Studio?IDE 中正确配置了 VC++ 插件。如果没有,请重新安装软件,并在此过程中选择 VC++ 选项。
? - 打开 Visual Studio?IDE。转到“文件”菜单,选择“新建项目”,您将在对话框左窗格中找到 VC++ 语言插件。
? - 展开 VC++ 并选择 CLR。然后,从右窗格中选择“CLR 控制台应用程序”。
? - 最后,给项目起一个名字,如“CLI_test”,最后按下OK键,如上图所示。
? - 现在,从“解决方案资源管理器”中打开CLI_test.cpp文件,并提供以下代码:
- #include?"stdafx.h"??
- ??
- using?namespace?System;??
- ??
- int?main(array<System::String?^>?^args)??
- {??
- ????Console::WriteLine(L"Hello?World");??
- ????Console::ReadLine();??
- ????return?0;??
- ????} ?
- 最后,生成项目并在控制台中查看输出。
通过构建控制台应用程序
创建文件 C++ / CLI 术语
本部分旨在通过概述基本的各种核心 C++/CLI 结构以及与面向对象编程相关的一些高级实现概念来启动 C++/CLI 编程,例如泛型、异常处理、委托和内存管理,在 CLR 领域使用 C++ 语法。
4、命名空间
.NET 类型组织在一个称为命名空间的特殊容器中。它可以体现任何类型,如类、接口、结构、属性、方法等......如果我们想引用其他程序集,我们需要在标头部分的 using 关键字之后指定 namespace 关键字。我们可以在 C++/CLI 中定义别名,但它们只能引用其他命名空间,而不能引用类。
- //?import?reference??
- using?namespace?System;??
- using?namespace?System::Text;??
- ??
- //alais??
- using?abc=?System::Windows::Forms;??
- ??
- //?namespace?definition??
- namespace?test??
- {??
- ????namespace?ajay??
- ????{??
- ????????namespace?champu??
- ?????????????{??
- ????????????????????//?code……??
- ?????????????}??
- ????}?????
- } ?
最后,我们不能用一个 namespace 语句定义分层命名空间,而是必须嵌套命名空间。
5、类(引用类型)
类在 C++/CLI 中也称为引用类型。在 C++ 中,类和结构具有几乎相同的含义;您不需要像在 C# 中那样区分引用类型和值类型,其中类通常是引用类型,结构是值类型。在 C++ 中,ref 关键字用于定义托管类或结构。
- //class?type??
- public?ref?class?testClass??
- {??
- };??
- ??
- //structure?type??
- public?ref?struct?testStruct??
- {??
- };??
当面对引用类型变量时,必须在托管堆上分配其对象。在 C++/CLI 中,我们定义句柄运算符 ^ 以处理引用类型的声明。 gcnew?运算符在托管堆上分配内存。我们可以使用 ?new?关键字在本机堆上分配空间。
- //Instantiation??
- testClass^?obj=gcnew?testClass();??
- ??
- testSruct^?obj1=?gcnew?testStruct();??
- ??
- obj1=?nullptr; ?
我们可以使用类似于 C# null 关键字的 nullptr 关键字从内存中取消引用或删除类型的相应空间。
6、方法
C++/CLI 中的方法声明与 C# 几乎相同,因为它们始终在类中定义。但有一个例外,即访问修饰符不是方法声明的一部分,而是写在方法声明之前。
- public?ref?class?testClass??
- {??
- ??
- ???public:??
- ???void?hello()??
- ???{??
- ???}??
- }; ?
- public:??
- ??????void?display(int?x)??
- ????{??
- ????}??
- ????????
- ???????void?operation(int%?i)??
- ????{??
- ????}??
- …………………??
- //Method?calling??
- ???????testClass^?xyz;???
- ???????testClass^?obj=gcnew?testClass();??
- ???????obj.operation(xyz); ?
7、构造函数
C++/CLI 构造函数与类(如 C#)同名。但与方法声明一样,访问修饰符与构造函数分离。
- public?ref?class?testClass??
- {??
- ??
- public:??
- ????testClass(String^?a)??
- ????{??
- ????????this->a=a;??
- ????}??
- private:??
- ????String^?a;??
- }; ?
8、值类型
为了声明值类型,C++/CLI 在类或结构关键字之前使用 value 关键字。使用值类型,我们可以在堆栈中分配类型空间。
- public?value?class?testClass??
- {??
- } ?
CLI 上下文下的预定义值类型列表:
? 枚举 枚举是使用 C++/CLI 语言中的 enum 关键字定义的。此实现与其他 .NET 语言(如 C#)几乎相同。
- public?enum?class?color??
- {??
- ??????RED,GREEN,BLUE,BLACK??
- }; ?
9、属性
C++/CLI 语言使用 property 关键字声明属性,它需要具有 get 访问器的类型,并且必须使用 set 访问器定义变量值。
- public?ref?class?testClass??
- {??
- private:??
- ????String^?name;??
- ??
- public:??
- ????property?String^?Name??
- ????{??
- ????????String^?get()??
- ????????{??
- ????????????return?name;??
- ????????}??
- ????????void?set()??
- ????????{??
- ????????????name=value;??
- ????????}??
- ????}??
- }; ?
10、先决条件
预计程序员必须精通本机 C++ 面向对象编程,并深入了解在 .NET CLR 上下文中构建和执行 C++ 和 C# 应用程序。
总结
本文描述了 C++/CLI 相对于原生 C++ 语言的重要性和优势。我们详细了解了 CLR 上下文下 C++/CLI 的核心剖析。在本文中,我们学习了如何定义各种核心概念的语法,如值类型、引用类型、方法和枚举。这些系列的下一篇文章将解释其余的概念,如接口、继承、多态、循环、数组等。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!