VC++ 2005:基础概览 讲师:李建忠 上海祝成科技 高级讲师
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
Hello,World! using namespace System; int main() { String^ msg =gcnew String("Hello, World!"); Console::WriteLine(text); }
追踪句柄^ VS. 指针* String^ msg; //C++/CLI版 string * pMsg; //ISO-C++版
gcnew VS. new msg=gcnew String("Hello, World!"); pMsg=new string("Hello, World!"); delete msg ? //仅仅用来调用析构函数以释放非托管资源,托管内存资源交由垃圾收集器负责(调用可选) delete pMsg // 不仅用来调用析构函数,同时也用来施放对象内存(必须调用,否则造成内存泄漏)
托管堆 VS. 本地堆 托管堆-垃圾收集自动服务 本地堆-程序员自己负责 托管堆由于垃圾收集服务的介入,影响了对象地址的稳定性,大大改变了对象模型
编译结果分析 通用中间语言(CIL) 元数据(Metadata) CIL与Metadata都是在软件体系结构中增加了一层间接(indirection)来实现一种抽象(abstract),从而对系统做更高层次的演绎和拓展
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
定义一个类型 ref class MyClass{ public: MyClass(){ Console::WriteLine("ctor"); } ~MyClass(){ Console::WriteLine("dtor"); };
栈对象的分配 MyClass myObject; 在ISO-C++中,myObject被分配于栈上 在C++/CLI中,myObject的分配依赖于类型系统。值类型(value class):分配在栈上,引用类型(ref class):分配在托管堆上
栈对象的消亡 在ISO-C++中,在清空栈空间时,会自动调用MyClass的析构函数,并且myObject在栈上的空间也随之被释放 在C++/CLI中,在清空栈空间时,也会自动调用MyClass的析构函数,但myObject要视MyClass的类型来定,如果是value class,那么其空间会随之被释放;如果是ref class,那么其在托管堆上的内存要交给垃圾收集器来处理
栈对象的地址运算 在ISO-C++中: 在C++/CLI中: MyClass* pMyObject=&myObject; (*pMyObject).MyMethod();//解引用 在C++/CLI中: MyClass^ pMyObject=%myObject; (*pMyObject).MyMethod(); //解引用
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
CLI是什么? CLI全称为通用语言基础构造(Common Language Infrastructure) CLI是一个虚拟机平台 CLI同样是增加了一层间接(indirection)来实现一种抽象(abstract),它定义了一个介于操作系统和应用程序软件之间的组件平台
CLI的组成部分 通用类型系统(Common Type System,简称CTS) 元数据 (Metadata) 通用语言规范(Common Language Specification,简称CLS) 虚拟执行系统(Virtual Execution System,简称VES) 其他:如可移植文件(portable file)格式,通用中间语言指令集,标准编程框
通用类型系统(CTS) 类型规范 任何一门CLI编程语言中提供的类型和成员都是CTS的一个子集 C++/CLI是目前对CTS描述最为完整的高级语言
元数据 (Metadata) 元数据是CLI组件平台的灵魂 元数据赋予了无限的组件管理、服务、动态能力 C++/CLI与ISO-C++的本质区别就在于对元数据的支持
通用语言规范(CLS) CLS是用以确保所有CLI语言能够互操作的一组规则 它定义了所有CLI语言都必须支持的一个最小功能集(一个CTS的子集) 各CLI语言可以选择自己对CTS的一部分的映射,但是它至少应该支持CLS所定义的最小功能集
虚拟执行系统(VES) VES为CLI程序提供了一个在各种可能的平台上加载和执行托管代码(即通用中间语言指令集)的虚拟机环境。 VES实现并贯彻了CTS模型 VES定义了一个相关的机器模型和状态、一组控制流构造,以及一个异常处理模型
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
何为集成? C++/CLI支持对本地编程和托管编程的无缝集成 集成不是简单混合,而是对象模型的集成
最简单的集成 直接使用cl /clr 编译即可 #include <iostream> #include <string> using namespace std; int main(){ string msg="Hello, World!"; cout<<msg; } 直接使用cl /clr 编译即可
IJW(it just works) 绝大多数ISO-C++代码编译后将得到托管代码,即IL代码。部分不能编译为IL代码的采用P/Invoke调用实现 代码托管,但数据并不托管——原来ISO-C++中本地堆内的数据仍位于本地堆中
更有价值的集成 #include "TextQuery.h" public ref class TextQueryCLI { TextQuery *pquery; public: TextQueryNet() : pquery( new TextQuery()){} ~TextQueryNet(){ delete pquery; } void query_text() { pquery->query_text(); } void build_up_text() { pquery->build_up_text();} };
更深层次的集成(1) 在一个托管类中包含本地对象 ref class ManagedClass{ NativeClass nObject; };
更深层次的集成(2) 在一个本地类中包含托管对象 class NativeClass{ ManagedClass mObject; };
更深层次的集成(3) 将一个本地对象放在托管堆中 NativeClass^ nObject = gcnew NativeClass;
更深层次的集成(4) 将一个托管对象放在本地堆中 ManagedClass* pmObject = new ManagedClass;
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
讲座总结 以史为鉴,可以知兴替 从小处着手,建立清晰的程序观念 从大处着眼,建立宏观的知识体系 良好的ISO-C++基础很重要
Agenda 第一个C++/CLI程序 栈对象语义的变化 通用语言基础构造CLI ISO-C++与CLI的集成 讲座总结 Q&A
Q & A
资源链接 msdn.microsoft.com/visualc comp.lang.c++.moderated blogs.msdn.com/slippman pluralsight.com/blogs/hsutter blog.joycode.com/lijianzhong www.chinaitclub.org/forums/