VC++ 2005系列课程(5) 指针与对象模型

合集下载

【C】Re05指针

【C】Re05指针

【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 = &num;// 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指针类型,直接这样赋值不会有语法错误提⽰// 但是在编译执⾏时会有警告提⽰,另外,如果指针调⽤了就会报错。

Visual C# 2005从入门到精通第05章

Visual C# 2005从入门到精通第05章

使用复合赋值和循环语句本章旨在教会你:●使用复合赋值操作符来更新一个变量的值●使用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 复合赋值操作符提示复合赋值操作符与简单赋值操作符具有一样的优先级和右结合性。

vs 2005

vs 2005

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++ 编译器工具和库,但开发环境却提供了对项目管理与配置(包括对大型项目的更好支持)、源代码编辑、源代码浏览和调试工具的强大支持。

实 验 5 类与对象

实  验  5   类与对象

实验五类与对象一、实验目的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。

Visual C++基础教程课件:类和对象

Visual C++基础教程课件:类和对象
类中的每一个成员都有确定的访问属性。关键字private下说 明的数据成员和成员函数是类的私有成员,它们只能被本类的 成员函数或友元函数访问。将成员说明为私有的,可以起到隐 藏成员的作用,提高安全性。关键字public下说明的数据成员和 成员函数是类的公有成员,它们可以被本类的成员函数访问, 也可以被其它类的成员函数或程序中的其它函数(通过对象)访问, 它们是类的外部接口。关键字protected下说明的数据成员和成员 函数是类的保护成员,它们可以由本类的成员函数访问,也可 以由其派生的派生类的成员函数访问,但不允许程序中的其它 函数访问。保护成员的具体访问规则在第4章中详细介绍。
类和对象
(2) 继承性。继承是一种连接类与类的层次模型,是指一个 新类可以从现有的类派生而来。通过继承,新类(子类或派生类) 拥有了现有类(父类或基类)的特征,包括属性和行为,同时可 以修改或增加新的属性和行为,使新类更适合具体的需要。这 样,在设计新类时,只需对新类增加的内容或是对现有类内容 的修改设计代码。可见,继承性简化了类的设计,提高了软件 的重用性,大大提高了软件的开发效率和系统的可靠性。
类和对象
说明: (1) 类定义中的访问权限控制符private、public和protected 可以按任意顺序出现任意次。建议将相同访问权限的成员归 类放在一起,以使程序结构更清晰。 至于私有成员和公有成员在类中出现的先后顺序,不同 的程序员有不同的主张。主张将私有成员放在前面的程序员 认为,由于成员的缺省访问权限是private,一旦程序员忘记使 用控制符private,类的数据仍然能得到保护。主张将公有成员 放在前面的程序员认为,公有成员是类提供的外部接口,是 用户所关心的,便于阅读。 (2) 类中说明的数据成员可以是任何数据类型,包括自身 类的指针或引用,但不能是自身类的对象。 (3) 在类中说明的任何成员不能使用extern、auto和 register关键字进行修饰。

VC++2005入门经典

VC++2005入门经典

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具有预编译头文件的功能所致。

C#2005 模拟资源管理器

C#2005  模拟资源管理器
System.Console.WriteLine("(1)向集合中添加元素");
System.Console.WriteLine("(2)删除集合中的元素");
System.Console.WriteLine("(3)退出程序");
System.Console.WriteLine("请输入要执行操作的编号:");
ShowList(slList);
goto osList;
}
else if (strNumer == "3")
{
goto osListExit;
}
else
{
System.Console.WriteLine("对不起,输入的操作编号不正确!");
goto osList;
}
}
osListExit:
{
System.Console.WriteLine("成功退出程序!");
static protected SortedList slList = new SortedList();
static voidMain(string[] args)
{
for (int i = 0; i < 10; i++)
{
slList.Add("Node" + i.ToString(), "模拟节点" + i.ToString());
System.Console.WriteLine("㈩{0}", strValue, strKey);
}
count++;

VisualBasic2005语言基础、函数与程序

VisualBasic2005语言基础、函数与程序

前言
➢VB 2005是一种面向对象程序设计语言,它提供了功能强 大的可视化控件,可以使应用程序的界面非常漂亮。 ➢在利用窗体和控件为应用程序建立界面的同时还需要编写 程序代码,代码对事件做出响应以执行预期的任务。 ➢数据是计算机程序代码处理的对象,是程序的基础,也是 运算产生的结果,所以应该首先认识VB 2005能处理哪些 数据,掌握各种形式数据的表示方法。 ➢本章主要介绍VB 2005的数据类型,变量和常量,各种表 达式和常用系统函数,以及基本语句的格式。
d2 = #1:15:30 PM#
' 变量d2被赋值时间
VisualBasic2005语言基础、函数 和程序
5. 对象数据类型
➢对象(Object)数据类型(4字节)指向应用程序或其他应用
程序中的一个对象。Object类型是一种万能数据类型,因为任 何东西都可以是.NET框架中的一个对象。
➢当其中包含值类型时,Object类型数据被作为值类型处理;当 其中包含引用类型时,Object类型数据被作为引用类型处理。 对象数据类型的默认值是空,即没有任何对象。
可用的表达式数据类型
任何数值类型(包括Byte、SByte和枚举类型)、String、Object 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead String、Object String、Object 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任意类型 任何数值类型(包括Byte和枚举类型)、Boolean、String、Object 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead 任何数值类型(包括Byte、SByte和枚举类型)、String、Object、Boolead、 Char、Char( )、Date、数组 当转换为基础类型时,允许用相同类型的转换关键字;当转换为复合类型时 转换结果是由它实现的接口及其基类 任何数值类型(包括Byte、SByte和枚举类型)、Boolean、String、Object 任何数值类型(包括Byte、SByte和枚举类型)、Boolean、String、Object
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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/









相关文档
最新文档