VC++ 2005 :基础概览

34
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 Presentation

Transcript of VC++ 2005 :基础概览

Page 1: VC++ 2005 :基础概览

VC++ 2005 :基础概览

讲师:李建忠 上海祝成科技 高级讲师

Page 2: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 3: VC++ 2005 :基础概览

Hello,World!Hello,World!

using namespace System;int main(){ String^ msg =gcnew

String("Hello, World!");Console::WriteLine(text);

}

Page 4: VC++ 2005 :基础概览

追踪句柄追踪句柄 ^ VS. ^ VS. 指针指针 **• String^ msg; //C++/CLI 版• string * pMsg; //ISO-C++ 版

• 为什么不直接采用 ISO-C++ 指针的表示法?内容决定形式,形式反映内容——垃圾收集导致对象地址的不稳定。

Page 5: VC++ 2005 :基础概览

gcnew VS. newgcnew VS. new

• msg=gcnew String("Hello, World!");• pMsg=new string("Hello, World!");• delete msg ? // 仅仅用来调用析构函数以释

放非托管资源,托管内存资源交由垃圾收集器负责(调用可选)

• delete pMsg // 不仅用来调用析构函数,同时也用来施放对象内存(必须调用,否则造成内存泄漏)

Page 6: VC++ 2005 :基础概览

托管堆 托管堆 VS. VS. 本地堆本地堆• 托管堆 - 垃圾收集自动服务• 本地堆 - 程序员自己负责

• 托管堆由于垃圾收集服务的介入,影响了对象地址的稳定性,大大改变了对象模型

Page 7: VC++ 2005 :基础概览

编译结果分析编译结果分析

• 通用中间语言( CIL )• 元数据( Metadata )• CIL 与 Metadata 都是在软件体系结构中增

加了一层间接( indirection )来实现一种抽象( abstract ),从而对系统做更高层次的演绎和拓展

Page 8: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 9: VC++ 2005 :基础概览

定义一个类型定义一个类型ref class MyClass{public:

MyClass(){Console::WriteLine("ctor");

}~MyClass(){

Console::WriteLine("dtor");}

};

Page 10: VC++ 2005 :基础概览

栈对象的分配栈对象的分配

• MyClass myObject;

• 在 ISO-C++ 中, myObject 被分配于栈上• 在 C++/CLI 中, myObject 的分配依赖于

类型系统。值类型( value class ):分配在栈上,引用类型 (ref class) :分配在托管堆上

Page 11: VC++ 2005 :基础概览

栈对象的消亡栈对象的消亡• 在 ISO-C++ 中,在清空栈空间时,会自动调用 M

yClass 的析构函数,并且 myObject 在栈上的空间也随之被释放

• 在 C++/CLI 中,在清空栈空间时,也会自动调用MyClass 的析构函数,但 myObject 要视 MyClass 的类型来定,如果是 value class ,那么其空间会随之被释放;如果是 ref class ,那么其在托管堆上的内存要交给垃圾收集器来处理

Page 12: VC++ 2005 :基础概览

栈对象的地址运算栈对象的地址运算• 在 ISO-C++ 中:

MyClass* pMyObject=&myObject;(*pMyObject).MyMethod();// 解引用

• 在 C++/CLI 中:MyClass^ pMyObject=%myObject;(*pMyObject).MyMethod(); // 解引用

Page 13: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 14: VC++ 2005 :基础概览

CLICLI 是什么?是什么?

• CLI 全称为通用语言基础构造( Common Language Infrastructure )

• CLI 是一个虚拟机平台• CLI 同样是增加了一层间接( indirectio

n )来实现一种抽象( abstract ),它定义了一个介于操作系统和应用程序软件之间的组件平台

Page 15: VC++ 2005 :基础概览

CLICLI 的组成部分的组成部分• 通用类型系统( Common Type System ,简称 CT

S ) • 元数据 ( Metadata)• 通用语言规范( Common Language Specificatio

n ,简称 CLS ) • 虚拟执行系统( Virtual Execution System ,简称

VES ) • 其他:如可移植文件( portable file )格式,通用

中间语言指令集,标准编程框

Page 16: VC++ 2005 :基础概览

通用类型系统(通用类型系统( CTSCTS ))

• 类型规范•任何一门 CLI 编程语言中提供的类型和成

员都是 CTS 的一个子集 • C++/CLI 是目前对 CTS描述最为完整的高级语言

Page 17: VC++ 2005 :基础概览

元数据 (元数据 ( Metadata)Metadata)

• 元数据是 CLI 组件平台的灵魂• 元数据赋予了无限的组件管理、服务、动态能力

• C++/CLI 与 ISO-C++ 的本质区别就在于对元数据的支持

Page 18: VC++ 2005 :基础概览

通用语言规范(通用语言规范( CLSCLS ))

• CLS 是用以确保所有 CLI 语言能够互操作的一组规则

• 它定义了所有 CLI 语言都必须支持的一个最小功能集(一个 CTS 的子集)

•各 CLI 语言可以选择自己对 CTS 的一部分的映射,但是它至少应该支持 CLS所定义的最小功能集

Page 19: VC++ 2005 :基础概览

虚拟执行系统(虚拟执行系统( VESVES ))

• VES 为 CLI 程序提供了一个在各种可能的平台上加载和执行托管代码(即通用中间语言指令集)的虚拟机环境。

• VES 实现并贯彻了 CTS 模型 • VES 定义了一个相关的机器模型和状态、

一组控制流构造,以及一个异常处理模型

Page 20: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 21: VC++ 2005 :基础概览

何为集成?何为集成?

• C++/CLI支持对本地编程和托管编程的无缝集成

• 集成不是简单混合,而是对象模型的集成

Page 22: VC++ 2005 :基础概览

最简单的集成最简单的集成#include <iostream>#include <string>using namespace std;int main(){

string msg="Hello, World!"; cout<<msg;

}直接使用 cl /clr 编译即可

Page 23: VC++ 2005 :基础概览

IJWIJW (( it just worksit just works ) )

•绝大多数 ISO-C++代码编译后将得到托管代码,即 IL代码。部分不能编译为 IL代码的采用 P/Invoke 调用实现

•代码托管,但数据并不托管——原来 ISO-C++ 中本地堆内的数据仍位于本地堆中

Page 24: VC++ 2005 :基础概览

更有价值的集成更有价值的集成#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 :基础概览

更深层次的集成(更深层次的集成( 11 ))

在一个托管类中包含本地对象

ref class ManagedClass{ NativeClass nObject;

};

Page 26: VC++ 2005 :基础概览

更深层次的集成(更深层次的集成( 22 ))

在一个本地类中包含托管对象

class NativeClass{ ManagedClass mObject;

};

Page 27: VC++ 2005 :基础概览

更深层次的集成(更深层次的集成( 33 ))

将一个本地对象放在托管堆中

NativeClass^ nObject = gcnew NativeClass;

Page 28: VC++ 2005 :基础概览

更深层次的集成(更深层次的集成( 44 ))

将一个托管对象放在本地堆中

ManagedClass* pmObject = new ManagedClass;

Page 29: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 30: VC++ 2005 :基础概览

讲座总结讲座总结

• 以史为鉴,可以知兴替• 从小处着手,建立清晰的程序观念• 从大处着眼,建立宏观的知识体系•良好的 ISO-C++ 基础很重要

Page 31: VC++ 2005 :基础概览

AgendaAgenda

• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A

Page 32: VC++ 2005 :基础概览

Q & AQ & A

Page 33: VC++ 2005 :基础概览

资源链接资源链接

• 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 :基础概览