托管C++程序设计.ppt_第1页
托管C++程序设计.ppt_第2页
托管C++程序设计.ppt_第3页
托管C++程序设计.ppt_第4页
托管C++程序设计.ppt_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章:托管C编程。托管C可以充分利用。NET框架,并允许用C语言编写的模块与用其他语言(如C#、Visual Basic等)编写的模块相结合。)。本章主要介绍托管C语言编程的基本知识,包括CLR、托管程序、垃圾收集、托管数据类型、程序集、托管类、托管继承、接口、抽象类、托管引用类型和值类型、委托和事件等概念和技术。这些内容是Windows编程的基础,也是C#和Visual Basic中常见的编程概念和技术。NET环境。9.1 CLR和托管程序,1。CLR和托管程序CLR是公共语言运行时库,它们为中的每种编程语言提供了公共的程序执行环境。NET。在CLR中运行的代码称为托管代码,不在CLR中运

2、行的代码称为非托管代码。9.1 CLR和托管程序,2。NET托管和非托管程序之间的关系,9.1 CLR和托管程序,2。联系类型系统和元数据联系类型系统是常见类型系统,其主要功能是定义一组。 NET数据类型由所有人共享。NET编程语言及其内部格式。这些类型中的大多数都符合CLS规范,并且可以在许多托管语言中共享,以实现语言的互操作性。建立一个支持跨语言集成、类型安全和高性能代码执行的框架。提供一个面向对象的模型,支持多种编程语言的完整实现。定义每种语言必须遵守的规则有助于确保用不同语言编写的对象可以交互。9.1 CLR和托管程序。3.元数据元数据用于描述运行时类型(类、接口和值类型)、字段、方法

3、、内部实现以及CLR在JIT编译MSIL、加载类、执行代码和与本机域交互时使用的布局信息。元数据包含在每个CLR组件中,并且可用于CLR、工具和服务。它通过定义存储和检索类型信息的统一机制,使语言互操作成为可能。9.1 CLR和托管程序,4。CLS是通用语言规范,它是CTS的一个子集。所有适用于CTS的规则都适用于CLS,它描述了一套基本的语言功能,并定义了编程语言之间的互操作规则,以确保多语言互操作性的实现。CLS是所有语言都基于的最小函数集。微软定义的. NET框架必须支持。包括变量的命名规则,定义基本数据类型,如Int32、Int64、Single、Double、Boolean等。禁止无

4、符号数字数据类型、指定函数列表的规范、定义和传输事件名称和事件参数的规范、禁止内存指针和函数指针等。9.1 CLR和托管程序,5。MSIL微软中间语言微软,中间语言。MSIL是由CLR提供的一组指令,可以有效地转换成本机代码,并且独立于中央处理器。要使代码运行,必须首先将MSIL转换为特定于中央处理器的代码。6.JIT编译CLR。NET程序,它将首先编译成MSIL代码。当程序被执行时,被调用的功能代码将由CLR从MSIL代码编译成本机代码(即机器指令代码)以供执行,这被称为JIT(即时)编译。9.1 CLR和托管程序,7。垃圾收集在托管程序中,堆空间由CLR管理,称为托管堆。托管堆由使用gcn

5、ew的程序员分配,就像c语言中的new一样,但是托管堆不需要程序员像free一样使用命令进行回收。当内存不足时,CLR将自动搜索托管堆中那些没有指针或没有被引用的对象(因为它们无用并占用内存空间,所以它们被称为垃圾),释放它们,并将它们占用的内存空间返回给系统供其他程序使用。这种方法被称为垃圾收集。9.1 CLR和托管程序,8。托管程序的执行过程,9.2托管数据类型,1。托管数据类型的概念和概述。的CTS。NET框架定义了一些类型,如Int16、Double、Char等。其中许多符合CLS规范,可用于中托管的C、C#和Visual Basic程序的设计。NET环境,这称为托管数据类型。,9.2

6、托管数据类型,2。值类型。NET还提供了许多类似于c语言中的int、char、double的类型,如Int32、Char、Double等。这些类型将数据存储在自己的内存分配单元中,称为值类型。每个值类型变量都有自己的数据副本。当它作为参数传递给函数时,值类型会将其值复制到参数变量,因此一个值类型变量的操作不会影响其他值类型变量。ValueType比内置类型(如c语言中的int和char)更强大。它是一个类,所有值类型都隐式地从ValueType类派生,这可能会重载valuetype中的函数。9.2托管数据类型,中的值类型。NET有以下特点:值类型没有与存储类的对象相关的系统开销,也不需要构造函

7、数。值类型是密封的,不能继承。默认情况下,所有值类型都是从System:ValueType值类型类派生的。值类型可以有字段、属性和事件。它们也有静态和非静态方法。当它们被装箱时,它们从系统继承虚拟方法。值类型,可以实现零个或多个接口。9.2.2参考类型1。引用类型的概念引用类型的变量将对象的地址存储在内存中,通过它可以访问相应存储单元中的对象。引用类型实际上是一个指针,就定义、访问方法和内存空间分配而言,它类似于C或C语言中的指针类型。9.2托管数据类型,2。值类型和引用类型的区别值类型对象存储在由CLR管理的堆栈中,它们的值可以直接访问。引用类型存储在由CLR管理的堆中,基于引用类型的变量包

8、含托管堆中的地址,它所指向的托管堆中的对象只能通过指针或引用来访问。在堆中分配的引用类型的对象不会在它所属的函数调用结束时自动释放它所占用的内存,它的内存管理是由CLR完成的。9.2托管数据类型,2。值类型和引用类型之间的差异,9.2.3打包和解包,1。概念打包是将值类型打包到对象引用类型的对象中,这样值类型就可以被视为对象并存储在托管堆中。打包值类型会在托管堆中创建新对象,并将值类型的值复制到新对象中。Unbox是实现接口的从对象类型到值类型或从接口类型到值类型的显式转换。打包相当于将值类型对象放入一个框中,这是一个可以放在托管堆中的引用类型。从技术上讲,值类型和引用类型都是从对象类派生的,

9、装箱是从值类型到对象类型或由该值类型实现的任何接口类型的隐式转换。9.2.3托管数据类型,2。打包和解包的过程是在VC2005之后定义托管引用的指针。9.2.3 MC引用类型和托管堆,1。在MC托管指针语法的早期阶段(VC 2003之前),_gc被用来表示托管数据定义:Int arrA _ gc/将arrA定义为托管数组arrA=new int _gc20 /在托管堆中建议托管数组arrA int _ gc * ptr/在将ptr定义为托管指针(VC版本2005)之后,使用来表示托管引用指针,并使用genew来分配托管内存。因此,在托管C *中有两种类型的指针:本地指针,新指针用于在本地堆中分

10、配内存单元。使用gcnew在托管堆中分配内存的托管指针。下面的代码示例演示了托管堆对象的建立和访问方法。int main(数组参数)int i=123/值类型对象o=I;/i在被分配给托管对象o int j=(int)o之前被装箱;/解包并将值从o复制到j int * ptr=new int(32);/在本地堆中创建一个对象int rptr=gcnew int(98);/L1在托管堆中创建一个引用对象,它将把值类型打勾。/在本地堆中生成对象px-a=10;/X rx=gcnew X;/L2:错误,x是值类型,不能装箱。/字符串* S1=新字符串(不允许!);/字符串只能在托管堆中创建对象。字符

11、串s2=新字符串(这没关系!);/创建字符串的引用对象S2-ToUpper();/引用对象的成员作为指针被访问,而ToUpper是字符串的成员函数。删除ptr/您必须显示本地堆中对象的释放。/删除rptr/托管堆中的对象由CLR清理,因此程序员不必费心返回0;9.3。NET程序集和命名空间,1。NET汇编程序集是托管程序的基本单元,它们构成。NET应用程序。程序集包含由CLR执行的MSIL代码、描述程序集及其内容的元数据以及CLR执行程序所需的其他文件。程序集是中程序的部署、版本控制、重用、激活范围和安全权限的基本单元。NET,它是为功能逻辑单元的常见操作和形成而生成的类型和资源的集合。托管程

12、序总是驻留在一个或多个程序集中。与标准的窗口程序或组件对象相比,程序集更加独立,因为它们不依赖于外部信息。例如,标准的Windows程序需要Windows注册表信息才能运行,而程序集不需要,并且所有信息都包含在它自身中,这简化了程序的部署。2.公共命名空间;9.4简单的大规模定制程序设计;1.第一个托管C程序示例9-1现在,构建第一个MC程序。建立第一个最简单的托管c程序“Hellow MC!”在Visual Studio 2008环境中使用向导。过程如下:(1)启动Visual Studio 2008,选择“新建”|“项目”,在弹出的“新建项目”对话框的“项目类型”列表中选择“Visual

13、C+|“CLR”。在模板列表中选择CLR控制台应用程序,如图9-6所示。9.4简单MC编程,9.4简单MC编程,向导生成以下文件:resource.h,它包含项目使用的资源定义的资源头文件;标准系统包含头文件,在正常情况下,头文件是Visual C项目中的特殊预编译文件。它们一起生成预编译文件,为程序提供所需的类型和数据。App.ico,应用程序图标文件;App.rc,项目的资源脚本文件。资源脚本文件包含以下内容(取决于项目类型和为项目选择的支持,如工具栏、对话框或超文本标记语言):默认菜单定义、快捷键和字符串表、对话框、图标文件、版本信息、位图、工具栏、超文本标记语言文件等。Assembly

14、Info.cpp,它包含用于修改项目的程序集元数据的信息,即属性、文件、资源、类型、版本信息、签名和其他信息。9.4简单MC程序设计,向导生成一个托管C程序:Hellow.cpp,主项目文件,其内容如下:/Hellow.cpp:主项目文件。#使用命名空间系统包含标准语法;内部主(数组参数)控制台:写线(世界各地);返回0;9.4.2 MC数据类型,1。系统命名空间和数据类型系统命名空间是中基本类型的根命名空间。NET框架。这个命名空间定义了可以在所有应用程序中使用的基本数据类型的类:对象(继承层次的根)、字节、字符、数组、整数、字符串等。VC。NET支持标准C和托管C编程,并允许将非托管代码添

15、加到托管程序中。因此,之前介绍的标准C中使用的数据类型和程序代码以及中定义的类型和类。NET可以添加到托管程序中。2.MC的常用数据类型,例9-2用托管C设计一个函数来判断一个整数是否是素数,并找出100以内的素数。建立一个Visual C CLR控制台应用程序项目CH9-2,并将主项目文件修改为:/CH9-2.cpp:主项目文件。#使用命名空间系统包含标准的。布尔is prime(int 32n)int 32m=Math :3360 sqrt(n);int 32 I;对于(I=2;i=m 1)返回真;否则返回falseint 32(n=2)的int main(数组参数);n=100n ) i

16、f (isPrime(n)控制台:写线(n);返回0;9.4.3基于控制台程序的数据输入和输出,1。控制台类Console是System命名空间中的一个类,它提供了多种数据输出功能,可以自动将值类型实例、字符数组和对象集转换为格式化或未格式化的字符串,然后将这些字符串输出到控制台。控制台类还提供了一些属性,用于获取或设置控制台窗口的大小、位置、前景色和背景色,获取或设置光标的位置,以及播放提示音。9.4.3基于控制台程序的数据输入和输出,2。使用读取和读取行读取输入数据(),并从输入流中读取一个字符。ReadLine()从输入流中读取一行字符。返回类型为System:String的字符串。如果引用了输入流中的一个字符行,则返回null。ReadLine读取回车和换行并结束。3.使用write和WriteLine输出数据Write(exp),并将表达式exp的值以文本形式写入标准输出流。WriteLine(exp),它将表达式的值作为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论