没有合适的资源?快使用搜索试试~ 我知道了~
一个关于C、C++指针的文档,还有是多态的文档!很详细!
需积分: 0 1 下载量 148 浏览量
2011-04-05
16:30:35
上传
评论
收藏 348KB DOC 举报
温馨提示
试读
55页
一个关于C、C++指针的文档,还有是多态的文档!很详细!
资源详情
资源评论
资源推荐
组合和聚合的区别
有几个概念 组合 聚合 关联。
关联 就是 类的一个函数的形参是另一个类。
关联在 中呈现为:
或 或
即一个类作为另一个类方法的参数。
聚合就是一个类的成员变量是另外一个指针 指向另外一个类。
组合 是一个类的成员是另外一个类对象
即类 包含类 的对象。
准确的 类图中用空心聚合)和实心菱形对聚合和组合进行了区分
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,
聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合
的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的
对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组
合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,
必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个
聚合对象,例如一个员工可能可以属于多个公司。
我想举个通俗的例子。
你和你的心脏之间是 ! 关系心脏只属于自己
你和你买的书之间是 ""#$" 关系(书可能是别人的)
你和你的朋友之间是 关系
见:%!"%&$'()%*#+,''-.'%
【依赖】【关联】【聚合】【组合】的区别
实例化依赖
将 作为局部变量进行使用
程序
/0112
1
111111111
11111113 $$%0
关联
与 存在一定的关系11这里只考虑单向导航11关联在代码中有多种表现形式
第一种411作为参数
程序
/01121111111111#1111
11111113 $$%0
第二种411作为成员变量
程序 )
11
!
111111111
1111111
111111111111111+11511
1111111
1111111/0112
1111111
111111111111111+3 $$%0
1111111
!#/$
111111111+111111+
)聚合
聚合是一种特殊的关联411聚合更明确指出聚合的主体具有整体6部分关系11代码的表现形式见程序 )
7组合
组合是一种特殊的聚合411组合中的某个主体控制着另外一个主体的生命周期4而且他们还存在整体6部分
关系
程序 7
11
!
1111111
1111111
111111111111111+11511$*11
1111111
2
11111118
1111111
1111111111111110$$$11+
111111111111111+115119
1111111
1111111/0112
1111111
111111111111111+6:3 $$%0
1111111
!#/$
111111111+
指针类型和指针指向的类型
指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类
型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int*ptr;// 指针的类型是 int*
(2)char*ptr;// 指针的类型是 char*
(3)int**ptr;//指针的类型是 int**
(4)int(*ptr)[3];// 指针的类型是 int(*)[3]
(5)int*(*ptr)[4];// 指针的类型是 int*(*)[4]
怎么样?找出指针的类型的方法是不是很简单?
指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存
区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符 *去掉,剩下的
就是指针所指向的类型。例如:
(1)int*ptr;// 指针所指向的类型是 int
(2)char*ptr;// 指针所指向的的类型是 char
(3)int**ptr;//指针所指向的的类型是 int*
(4)int(*ptr)[3];// 指针所指向的的类型是 int()[3]
(5)int*(*ptr)[4];// 指针所指向的的类型是 int*()[4]
3
在指针的算术运算中,指针所指向的类型有很大的作用。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对 C 越来越熟悉时,
你会发现,把与指针搅和在一起的" 类型"这个概念分成"指针的类型"和"指针所指向的类型"两
个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两
个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
当指针做加减运算的时候,增加的是以指针所指向类型为单位
堆(heap)和栈(stack)的区别:
堆(heap)和栈(stack)是 C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念都可以在讲数据结
构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。
在具体的 C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示, 栈是机器系
统提供的数据结构,而堆则是 C/C++函数库提供的。
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存
器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。
这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支持的数据类型,
并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序中是非常频繁的。对子程序的调
用就是直接利用栈完成的。机器的 call 指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,
而子程序中的 ret 指令则隐含从堆栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈
的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因。
和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基
本的 malloc/realloc/free 函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存空间时,
这套函数首先试图从内部堆中寻找可用的内存空间,如果没有可以使用的内存空间,则试图利用系统调
用来动态增加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形
式返回给调用者。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会被适当的
处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这套复杂的分配机制
实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若干原因:
1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求
(按页分配);这样的话对于大量的小内存分类来说会造成浪费。
2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。
3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。
我眼中的指针
作者序
4
为初学者服务。这是我的帖子的宗旨。我也是个初学者(强调了无数遍了) ,我以我的理解把初学者觉
得难懂的东西用浅显的语言写出来。由于小学时语文没学好,所以竭尽全力也未必能达到这个目的。尽
力而为吧。
指针是 c 和 c++中的难点和重点。我只精通 dos 下的 basic。c 语言的其它各种特性,在 basic 中都有类似
的东西。只有指针,是 baisc 所不具备的。指针是 c 的灵魂。
我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我
理解得有点道理的东西写出来。我的目的是:
1.通过写这些东西,把我脑袋中关于 c 的模糊的知识清晰化。
2.给初学者们一点提示。
3.赚几个经验值。(因为贴这些东西没有灌水之嫌啊)
第一章。指针的概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指
针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针
本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
(1)int *ptr;
(2)char *ptr;
(3)int **ptr;
(4)int (*ptr)[3];
(5)int *(*ptr)[4];
如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解 c 和 c++的复杂类型声明>>。
1。 指针的类型。
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指
针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int *ptr; //指针的类型是 int *
(2)char *ptr; //指针的类型是 char *
(3)int **ptr; //指针的类型是 int **
(4)int (*ptr)[3]; //指针的类型是 int(*)[3]
(5)int *(*ptr)[4]; //指针的类型是 int *(*)[4]
怎么样?找出指针的类型的方法是不是很简单?
2。指针所指向的类型。
5
剩余54页未读,继续阅读
wang1990yujin
- 粉丝: 8
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0