VC++ 2005系列课程(5) 指针与对象模型
- 格式:pdf
- 大小:692.72 KB
- 文档页数:27
【C】Re05指针⼀、变量 & 指针变量 = 内存地址 + 存储值指针变量 = 内存地址 + 存储值【变量的内存地址】作⽤:间接访问内存地址内存地址 = 地址编号地址编号:内存中的每个字节唯⼀的编号,从0开始记录,使⽤⼗六进制显⽰可以使⽤指针变量存储变量的地址不同数据类型就有对应的指针的数据类型⼆、使⽤#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>void pointer () {// 指针变量int * pointer;// 变量int varA = 100;printf("pointer -> x16 %x, x10 %d, x8 %o\n", pointer, pointer, pointer);printf("varA -> %d\n", varA);printf("- - - - - - - - - - - - - - -\n");// 把varA的地址赋值给指针变量pointerpointer = &varA;// 通过指针变量pointer取地址访问varA变量*pointer = 20;printf("pointer -> x16 %x, x10 %d, x8 %o\n", pointer, pointer, pointer);printf("varA -> %d\n", varA);}int main() {pointer();return EXIT_SUCCESS;}输出格式注意:// %p显⽰完整⼗六进制位数, %x只显⽰进制数语法递进:int tf = (*pointer == *&varA); // 0 false, 1 trueint tf2 = (pointer == &varA);int tf3 = (*pointer == varA);printf(" %d\n",tf);printf(" %d\n",tf2);printf(" %d\n",tf3);三、空指针& 野指针空指针定义void nullPointerAndWildPointer () {// 定义⼀个空指针int * nullPointer = NULL;}指向的NULL常量来⾃于STDLIB标准库头⽂件的这⼀段#else#define NULL ((void *)0)#endif#endif最后指向的还是⼀个0⽽已void nullPointerAndWildPointer () {// 定义⼀个空指针int * nullPointer = 0;}实际上不建议直接写0,容易混淆指针变量与变量空指针不能被访问到:void nullPointerAndWildPointer () {// 定义⼀个空指针int * nullPointer = NULL;printf("nullPointer -> %p", *nullPointer);}int main() {nullPointerAndWildPointer();return EXIT_SUCCESS;}因为内存地址编号0 - 255已经被操作系统占⽤了空指针的作⽤:不知道应该对指针定义多少合适时使⽤野指针定义:void nullPointerAndWildPointer () {int * wildPointer = 0xffff;printf("wildPointer -> %p\n", *wildPointer);}指针变量存储了⾮法的、未知的⼀个内存地址,该地址存储的内容将⽆法访问但是允许查看地址void nullPointerAndWildPointer () {// 定义⼀个空指针// int * nullPointer = NULL;// printf("nullPointer -> %p\n", *nullPointer);// 定义⼀个野指针// int * wildPointer = 0xffff;// printf("wildPointer -> %p\n", *wildPointer);int * nullPointer = NULL;printf("nullPointer -> %p\n", nullPointer);int * wildPointer = 0xffff;printf("wildPointer -> %p\n", wildPointer);}int main() {nullPointerAndWildPointer();return EXIT_SUCCESS;}野指针的第⼆种情况:也是⼀样,地址可以访问,但是内部存储的值⽆法访问// 野指针的第⼆种情况int * wildPointer2;printf("wildPointer2 -> %p\n", wildPointer2);// printf("wildPointer2 value -> %d\n", *wildPointer2);四、⽆类型指针和万能指针1、Void类型概述void voidUsage() {// void 是⼀个数据类型,所以也具备对于的指针类型 void *// void 的⽤途是修饰函数返回类型和形参类型}// 形参修饰了void 表⽰该函数不需要参数void noNeedParam( void ) {}2、函数返回类型省略当函数的返回值类型声明的是void时,我们可以省略,不需要return不过不建议这样书写,C++并不⽀持这样的语法aaa () {printf("void返回类型省略的函数调⽤");}int main() {aaa();return EXIT_SUCCESS;}如果函数不需要注⼊任何类型的参数,编写时是可以明确标注void 数据类型即可3、⽆类型指针与万能指针:⽆类型指针可以强转任意类型接收对于的类型的变量地址void noTypePointer() {void * p = NULL;printf("sizeof p = %d\n", sizeof(p)); // 64位 sizeof p = 8 32位 sizeof p = 4int num = 10;p = #// printf("p = %d\n", *p); int指针类型赋值给void指针类型,类型不匹配错误// 使⽤强转来转换指针类型printf("p = %d\n", *(int *)p);}另外可以作为万能指针使⽤:void anyTypePointer() {void * pointer = NULL;int * varA = NULL;char * varB = NULL;// ⼀个是int指针类型⼀个是char指针类型,直接这样赋值不会有语法错误提⽰// 但是在编译执⾏时会有警告提⽰,另外,如果指针调⽤了就会报错。
使用复合赋值和循环语句本章旨在教会你:●使用复合赋值操作符来更新一个变量的值●使用while、for和do等循环语句●逐步执行一个do方法,并观察变量值的变化第4章讲述了如何使用if和switch结构来选择性地运行语句。
在本章,将介绍如何使用多种循环语句来重复运行一个或多个语句。
写循环语句时,通常需要控制重复次数。
为此,可以使用一个变量,在每次重复时都更新它的值,并在变量抵达一个特定的值时停止重复。
因此,还要介绍如何在这些情况下使用特殊的赋值操作符来更新一个变量的值。
5.1 使用复合赋值操作符前面讲过如何使用算术操作符来创建新值。
例如,以下语句使用操作符+来创建比变量answer大42的一个值,新值将写入控制台:Console.WriteLine(answer + 42);前面还讲过如何使用赋值语句来更改一个变量的值。
以下语句使用赋值操作符将answer的值变成42:answer = 42;如果希望在一个变量的值上加42,可以将赋值操作符与加法操作符合并到一起。
例如,以下语句在answer上加42,并将新值赋给answer。
换言之,在运行该语句之后,answer 的值将比之前大42:answer = answer + 42;虽然这是一个有效的语句,但有经验的程序员不会这样写。
在变量上加一个值是非常普遍的一个操作,所以Microsoft Visual C#专门提供了一个复合赋值操作符+=来简化这个操作。
为了在answer上加42,有经验的程序员会这样写:answer += 42;利用这个快捷方式,可以将任何算术操作符与赋值操作符合并到一起,表5.1对此进行了总结。
这些操作符统称为复合赋值操作符(compound assignment operator)。
第I部分Microsoft Visual C#和Microsoft Visual Studio 2005概述60表5.1 复合赋值操作符提示复合赋值操作符与简单赋值操作符具有一样的优先级和右结合性。
Visual Studio 2005Visual Studio 2005 简介Visual Studio 是一套完整的开发工具集,用于生成 Web 应用程序、XML Web Services、桌面应用程序和移动应用程序。
Visual Basic、Visual C++、Visual C# 和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 IDE 可以共享工具且有助于创建混合语言解决方案。
另外,这些语言利用了 .NET Framework 的功能,通过此框架可使用简化 ASP Web 应用程序和 XML Web Services 开发的关键技术。
Visual C++ 2005Microsoft Visual C++ 2005 提供了强大和灵活的开发环境,可用于创建基于 Microsoft Windows 和基于 Microsoft .NET 的应用程序。
它既可以用作集成开发系统,也可以用作一组独立的工具。
Visual C++ 包含下列组件:Visual C++ 2005 编译器工具。
该编译器包含一些新功能,支持面向虚拟计算机平台(如公共语言运行库 (CLR))的开发人员。
现在已经有面向 x64 和 Itanium 的编译器。
该编译器仍支持直接面向 x86 计算机,优化了针对这两种平台的性能。
z Visual C++ 2005 库。
其中包括行业标准活动模板库 (ATL)、Microsoft 基础类 (MFC) 库,以及各种标准库,如标准 C++ 库和 C 运行时库 (CRT)(该库已得到扩展,可以向引起安全问题的已知函数提供安全增强替代项)。
新增的库是 C++ 支持库,其设计意图在于简化面向 CLR 的程序。
z Visual C++ 2005 开发环境。
虽然可以从命令行使用 C++ 编译器工具和库,但开发环境却提供了对项目管理与配置(包括对大型项目的更好支持)、源代码编辑、源代码浏览和调试工具的强大支持。
实验五类与对象一、实验目的1.理解面向过程与面向对象区别2.理解面向对象的三大特征3.掌握类声明的方法4.掌握构造方法5.掌握对象的创建方法与创建机制6.掌握成员变量、类变量和局部变量区别7.掌握成员方法与类方法区别8.掌握函数的重载9.掌握4种访问修饰符的区别二、实验环境:JDK1.5三、实验内容1.创建猴子类。
具体要求如下:1)编写一个类Monkey,用来表示猴子类;2)给Monkey类确定添加4个属性:3个实例成员变量(名字、体重、年龄)、1个静态成员变量(爱好:默认值为:吃香蕉);3)添加默认构造方法和有参构造方法(3个参数,分别给名字、体重和年龄赋初始值)4)编写展示猴子能够爬树(climbTree)的方法――提供两个参数传入:分别代码猴子的名字(name)和爬树的高度(height)(方法内只需打印猴子的”名字+会爬树,能爬+高度”)5)测试:在main方法中创建两个猴子对象monkey1(甲、50、3)和monkey2(乙、45、2),monkey1使用默认构造方法创建,monkey2使用有参构造方法创建。
分别打印出monkey1和monkey2的名字、体重、年龄和爱好。
并调用monkey1和monkey2的爬树方法。
2.创建矩形Rectangle类。
具体要求如下:1)创建一个Rectangle类;2)创建属性:两个double成员变量:width和height。
3)创建方法:计算矩形的周长getLength()和面积getArea()。
4)测试:创建Rectangle对象,并给两个成员变量赋值,调用周长和面积的方法,输出周长和面积。
3.练习static修饰符的使用1) 编写类Teacher;2) 属性:教师的课时数量和计算课时的系数(所有教师的课时系数相同,使用static修饰),均为double类型;3) 方法:courseCompute(),可计算教师的当量课时(=课时量*系数),返回值类型为double。
2010-5-18一、使用MFC编写Windows程序1、MFC文档和视图的概念(1)文档是给予应用程序中与用户交互的数据集合的名称;表示要作为整体对待的程序中的应用数据;文档类是从MFC库中的CDocument类派生出来的,我们需要添加数据成员来存储应用程序需要的数据,还要添加成员函数来支持对数据的处理。
应用程序不仅仅限于单文档类型;当应用程序中涉及若干不同种类的文档时,我们可以定义多个文档类。
(2)文档界面我们可以选择是让处理一个文档,还是多个文档。
MFC库支持的单文档界面——缩写为SDI,用于那些每次只要打开一个文档的程序。
使用这种界面的程序被称为SDI应用程序。
对于那些需要一次打开多个文档的程序来说,我们可以使用多文档界面——MDI,这样我们的程序不仅能够打开类型相同的多个文档,还可以同时处理多个类型不同的文档。
(3)视图的概念视图总是与特定的文档对象相关。
视图对象可以提供一种机制来显示文档中存储的部分或全部数据。
视图定义了再窗口中显示数据的方式以及与用户交互的方式。
与定义文档类似,我们还是通过从MFC类CView派生的方法定义自己的视图类。
文档对象可以拥有任意多个与其相关的视图对象。
各个视图对象可以提供文档数据或文档数据子集的不同表示方法。
(4)连接文档或视图MFC提供了使文档与其视图相结合,以及使各个框架窗口与当前的活动视图相结合的机制。
文档对象自动维护着指向相关视图的指针列表,而视图对象拥有存储相关文档对象的指针数据成员。
文档、视图和框架窗口之间的写作,是由另一个名为文档模板的MFC类的对象安排的。
2010-5-201、在使用调试版本配置编译程序时,编译器不会检测未初始化的变量,因此即使我们仍然要测试程序,也可能需要临时使用发布版本配置进行连接和编译;2、预编译头文件初次编译程序可能需要较多的时间,但第二次及以后的编译过程应该非常快,这是由于VC2005具有预编译头文件的功能所致。
第1章编程及Visual C# 2005简介本章学习要点:⏹描述可视程序设计和开发的过程;⏹解释术语“面向对象编程”;⏹解释类、对象、属性、方法和事件的概念;⏹列出并描述编写C#程序的3个步骤;⏹描述构成C#项目的各种文件;⏹识别Visual Studio环境中的元素;⏹定义设计时间、运行时间和调试时间;⏹编写、运行、保存、打印并修改第一个C#程序;⏹识别语法错误、运行时错误和逻辑错误;⏹查找帮助系统中的C#主题。
1.1 使用Visual C#编写Windows应用程序本书将讲解如何编写在Microsoft Windows环境中运行的计算机程序,使项目表现出如同标准Windows程序那样的外观和行为。
将使用C#(C Sharp)和Windows Forms 中的工具,创建包含标签、文本框、按钮、单选按钮、复选框、列表框、菜单和滚动条等元素的窗口。
图1-1所示为两个Windows用户界面示例。
从第9章开始,将使用Web Forms和Visual Web Developer创建程序。
可以在诸如Internet Explorer的浏览器中、在Internet或公司内部网上运行Web应用程序。
图1-2所示为一个Web Form 应用程序。
图1-1使用C#和Windows Forms设计的应用程序的图形用户界面。
形用户界面(GUI)。
WindowsGUI定义各种元素的外观和功能。
可以使用包含这些元素的工具箱,创建名为窗体的新窗口,然后使用该工具箱添加称作控件的各种元素。
要编写的程序将采用一种被称为面向对象编程(ObjectOriented Programming,OOP)的编图1-2在浏览器中运行的Web Forms应用程序。
程技术。
1.2 编程语言——过程、事件驱动及面向对象差不多有数百种编程语言,每种语言的开发都是为了解决特定类型的问题。
大多数传统语言,如BASIC、C、COBOL、FORTRAN、PL/1和Pascal,都被认为是过程语言。
对象模型技术(OMT)
面向对象建模方法有很多种,也都在进一步的发展和完善中。
对象模型技术(OMT)是目前最为成熟和实用的方法之一。
它从三个方面对系统进行建模,每个模型从一个侧面反映系统的特性,三个模型分别是:对象模型、动态模型和功能模型。
对象模型表示静态的,结构化的"数据"性质,它是对模拟客观世界实体的对象及对象间的关系映射,描述了系统的静态及结构.通常用类图表示。
对象模型描述系统中对象的静态结构、对象之间的关系、对象的属性、对象的操作。
对象模型表示静态的、结构上的、系统的“数据”特征。
对象模型为动态模型和功能模型提供了基本的框架。
对象模型用包含对象和类的对象图来表示。
动态模型表示瞬间的,行为化的系统控制性质,他规定了对象模型中的对象合法化变化序列.通常用状态图表示.动态模型描述与时间和操作顺序有关的系统特征--激发事件、事件序列、确定事件先后关系的状态以及事件和状态的组织。
动态模型表示瞬间的、行为上的、系统的“控制”特征。
动态模型用状态图来表示,每张状态图显示了系统中一个类的所有对象所允许的状态和事件的顺序。
功能模型表示变化的系统的功能性质,它指明了系统应该做什么,因此直接地反映了用户对目标系统的需求,通常用数据流图表示.功能模型描述与值变换有关的系统特征--功能、映射、约束和函数依赖。
CL2005Ocx编程手册(V1.2)第一章简介1.1调用顺序本控件中函数的调用顺序如下:步骤一:通讯初始化,调用ComInitial、NetInitial或ModemInitial;步骤二:控制卡特性设置,调用SetCardProperty;步骤三:数据收发,调用数据收发函数;步骤四:关闭通讯,调用Close。
如果对联网控制的多个屏进行操作,则在步骤二和步骤三间进行循环。
1.2控制卡的工作模式CL2005系列控制卡均提供两种工作模式:图片模式和文字模式。
1.2.1图片模式在图片模式下,图片数据发送完后,必须调用发送节目表的函数(SendProgList),显示屏才会播放节目。
图片模式中,所有节目均具备移动展开特效。
允许设计定时播放和安排计算安全天数计时等。
1.2.2文字模式文字模式主要用于对实时显示要求比较高的场合。
此时,显示屏的作用类似于一个写字板,不具备任何定时和移动展开特效,只可以通过函数在显示屏的某个位置输出文字或画水平、垂直线,且文字的输出宽度不能大于显示屏的宽度。
控制卡上有两个显示缓冲区(Bank),可以在这两个显示缓冲区之间切换,即在显示0区的同时可以将输出定到1区,待要显示的内容输出完毕后再将1区切换到显示屏上真正显示出来,此时又可以在0区进行输出。
1.3语言说明本控件使用VC++语言开发,因此所有涉及的字符串都是指8位以0结尾的字符串。
第二章数据结构本控件涉及三类数据结构,它们是图片、节目表以及亮度表。
2.1图片的数据结构C语法:BYTE PictureBuff[512][256]Delphi语法:PictureBuff = Array[0..511] Of Array[0..255] Of BYTEBasic语法:Dim PictureBuff[0..255,0..511] As Byte说明:CL2005系列通讯屏控制卡最大控制宽度达2048列,1个位表示屏上1个点,则宽度使用256个8位的字节;最大控制高度为512行。
湖南财经高等专科学校课程教学实施计划注:此表由课程组或教研室组织教研活动,根据学期教学任务书、教学大纲和教材进行编制,经教研究室主任批准后,于期初报所在系(部)和教务处备查。
教研室:计算机专业基础教研室第1章 C#快速入门1.1 C#的优势作为编程语言,C#是现代的、简单的、完全面向对象的,而且是类型安全的。
重要的是,C#是一种现代编程语言。
在类、名字空间、方法重载和异常处理等方面,C#去掉了C++中的许多复杂性,借鉴和修改了Java 的许多特性,使其更加易于使用,不易出错。
下面列举了一些C#在设计上的优点:简单性1.没有指针是C#的一个显著特性, 用户使用一种可操控的(Managed )代码进行工作时,直接的内存存取,将是不允许的。
2.在C#中不再需要记住那些源于不同处理器结构的数据类型 现代性1.用户可以使用一个新的decimal 数据类型进行货币计算。
2.C#通过代码访问安全机制来保证安全性,根据代码的身份来源,可以分为不同的安全级别,不同级别的代码在被调用时会受到不同的限制。
面向对象1.C#支持面向对象的所有关键概念:封装、继承和多态性。
2. C#的继承机制只允许一个基类。
如果需要多重继承,用户可以使用接口。
类型安全性1.C#实施了最严格的类型安全机制来保护它自身及其垃圾收集器。
2.边界检查。
3.算术运算溢出检查。
4. C#中传递的引用参数是类型安全的。
版本处理技术C#尽其所能支持DLL 版本处理功能,虽然C#自己并不能保证提供正确的版本处理结果,但它为程序员提供了这种版本处理的可能性。
有了这个适当的支持,开发者可以确保当他开发的类库升级时,会与已有的客户应用保持二进制级别上的兼容性。
面向对象现代性C#在设计上的优点1.2 第一个C#程序首先看控制台应用程序的版本。
【例1.1】 在控制台窗口中输出“Hello World!”字样。
在Visual C#.NET 开发环境中新建一个控制台应用程序项目,并在源代码文件中输入如下语句:using System; class HelloWorld {public static void Main() {Console.WriteLine("Hello World!"); } }图1.0 .NET 框架的组成将此内容保存到文件EX1_1.cs中,然后选择菜单“调试”→“启动”或直接按F5键运行此程序。
1.将字符串类型转换成double型:double x=_tstof(m_strXPt);2.Format函数使用方法:m_strXPt.Format(_T("%2f"), pt[X]);3.CAD Control型变量类型:AcUiPickButton, AcUiDropSite, AcUiToolButton, AcUiSelectButton, AcUiBitmapStatic, AcUiOwnerDrawButton, AcUiBitmapButton4.“_T”: 找不到标识符解决办法:加入#include "tchar.h"5. setName(blkName); blkName[]要为WCHAR型6.从ads_point 转换到AcGePoint3d 类型的点,即可以通过数组元素直接赋值,也可以通过asPnt3d 函数直接转化:通过数组元素交换:ptInsert[X] = pt[X];ptInsert[Y] = pt[Y];ptInsert[Z] = pt[Z];使用asPnt3d 函数(需要包含geassign.h 头文件):AcGePoint3d ptInsert = asPnt3d(pt);之所以可以使用X、Y 和Z 直接作为数组的下标,是由于这三个字母在ObjectARX 有特殊的定义:enum { X = 0, Y = 1, Z = 2 };7.“CString”: 未声明的标识符在非mfc下使用CString 会导致上面错误:解决办法:(1)如果你使用那么:使用MFC:包含cstringt.h;不使用MFC:包含atlstr.h(2 )或者 #include <afx.h>8.用MessageBox同时显示字符串加变量值:CString str,str1;str="和数=";str1.Format(_T("%d"), R);str+=str1;MessageBox(str);9. 编译错误:mt.exe : general error c101008a: Failed to save the upda ted manifest to the file ".\Debug\TransSliderControl.exe.embed.manif est"解决方法:清理解决方案,再重新生成,Ok。
VC++ 2005:指针与对象模型
李建忠
上海祝成科技 高级讲师 2005年5月26日
• • • • • •
CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
CLI对象模型简介
• 对象模型是类型实例在机器(虚拟机)中 的表示 • 对象模型是深刻认识现代面向对象/面向组 件编程语言之根本。
• 掌握C++/CLI的关键是掌握托管CLI对象 模型,以及本地C++对象模型
CLI对象模型(1)
public ref class Point { public: int x; int y; }; int main() { Point^ p=gcnew Point; p->x=100; p->y=200; }
CLI对象模型(1)
CLI对象模型(2)
public ref class Point { public: int x; System::String^ s; }; int main() { Point^ p=gcnew Point; p->x=100; p->s=“hello”; }
CLI对象模型(2)
CLI对象模型(2)
CLI对象模型(3)
int main() { array<int>^ a= gcnew array<int>(3){0,1,2}; for each(int i in a) { System::Console::WriteLine(i); } }
CLI对象模型(3)
Agenda
• • • • • • CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
追踪句柄 tracking handle
int main() { Point^ p=gcnew Point; array<int>^ a= gcnew array<int>(3){0,1,2}; }
追踪句柄——指向“托管堆上一个完整的对象 (whole object)”的指针
追踪句柄的对象模型
Agenda
• • • • • • CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
内部指针 interior pointer
int main() { Point^ p=gcnew Point(); array<int>^ a= gcnew array<int>(3){0,1,2}; interior_ptr<int> px=&p->x; interior_ptr<int> py=&p->y; interior_ptr<int> pa0=&a[0]; interior_ptr<int> pa1=&a[1]; interior_ptr<int> pa2=&a[2];
}
内部指针的对象模型
内部指针的适用对象
• 包含本地指针,本地指针的超集 • 可以指向:
– 引用句柄 – 值类型或者装箱值类型句柄 – 托管类型内部成员 – 托管数组内部元素
Agenda
• • • • • • CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
固定指针 pinning pointer
void native_function(int* p) ; int main() { Point^ p=gcnew Point(); pin_ptr<int> px=&p->x; native_function(px);
}
固定指针的对象模型
固定指针的适用对象
• 可以指向:
– 引用句柄 – 值类型或者装箱值类型句柄 – 托管类型内部成员 – 托管数组内部元素
Agenda
• • • • • • CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
讲座总结
• C++/CLI由于垃圾收集器的引入,大大改 变了对象模型 • 有什么样的对象模型,便有什么样的指针 类型 • C++/CLI最复杂的集成是托管对象模型和 本地对象模型的集成
Agenda
• • • • • • CLI对象模型概览 追踪句柄 tracking handle 内部指针 interior pointer 固定指针 pinning pointer 讲座总结 Q&A
Q&A
资源链接
• • • • • • /visualc ng.c++.moderated /slippman /blogs/hsutter /lijianzhong /forums/
。