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