1 / 41
文档名称:

2011秋季第五讲构造结构数组等.ppt

格式:ppt   大小:282KB   页数:41页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

2011秋季第五讲构造结构数组等.ppt

上传人:分享精品 2017/12/15 文件大小:282 KB

下载得到文件列表

2011秋季第五讲构造结构数组等.ppt

相关文档

文档介绍

文档介绍:2017/12/15
Chen Kaiming Copyright 2007
1
第七:识别高级语言结构
构造函数和析构函数
对象、结构体和数组
this 指针
new与delete操作符
库函数
函数的参数
2017/12/15
Chen Kaiming Copyright 2007
2
构造函数和析构函数
构造函数是在创建对象的新实例时自动加以调用的, 它是可选的, 不能肯定地出现在对象中。
构造函数不返回函数值, 但这不能成为唯一性特征。
按照标准, 构造函数不应该自动地激活异常情形, 从其实现的目标代码可发现这点。
只有在检查空指针的代码作为结尾的函数才是构造函数. 而其他函数没有这样实现。
2017/12/15
Chen Kaiming Copyright 2007
3
析够函数: 最后调用的对象未必是析构函数。它只有在内存分配成功并且创建了对象的情况下才被调用。
构造函数最先被调用,析构函数最后被调用.
实验验证: 和
2017/12/15
Chen Kaiming Copyright 2007
4
堆中分配空间
高级语言形式:
A *a = new A
2017/12/15
Chen Kaiming Copyright 2007
5
堆中分配对象实体的代码
A *a=new A;
0040108D push 4
0040108F call operator new (004014f0)
00401094 add esp,4
00401097 mov dword ptr [ebp-20h],eax
0040109A mov dword ptr [ebp-4],0
004010A1 cmp dword ptr [ebp-20h],0
004010A5 je main+54h (004010b4)(分配不成功)
004010A7 mov ecx,dword ptr [ebp-20h]
004010AA call ***@ILT+30(A::A) (00401023)
(此处调用构造函数,最后调用析构函数)
004010AF mov dword ptr [ebp-34h],eax
004010B2 jmp main+5Bh (004010bb)
004010B4 mov dword ptr [ebp-34h],0
2017/12/15
Chen Kaiming Copyright 2007
6
处于堆栈中的构造和析构函数
main( )
{
MyClass zzz;
();
}
注意: 如果对象存放在栈中(不在堆中), 就不会检查内存分配是否成功. 使得构造函数、析构函数和其他函数难于区别。
2017/12/15
Chen Kaiming Copyright 2007
7
栈中分配对象实体的代码
MyClass t
0040118E lea ecx,[ebp-14h]
00401191 call ***@ILT+10(MyClass::MyClass) (0040100f)(直接调用构造函数)
00401196 mov dword ptr [ebp-4],1
2017/12/15
Chen Kaiming Copyright 2007
8
识别全局对象的构造/析构函数
定义: 静态对象, 在编译时间内被分配到数据段中.
问题: 不能可靠地识别构造/析构函数?
实现: 构造函数只能被调用一次, 使用一个初始值为0的全局变量标志, 然后在首次调用构造函数之前将该值加1, 进行程序迭代时, 就不得不判断该标志是否为0。构造函数是用一个能够将它与所有其他函数可靠地进行区分的分支所包围的.
2017/12/15
Chen Kaiming Copyright 2007
9
全局对象的构造/析构函数例
main()
{
static MyClass zzz;
();
}
vc6编译结果---反汇编代码见
2017/12/15
Chen Kaiming Copyright 2007
10
全局对象实例代码
static MyClass zzz;
00401138 xor eax,eax
0040113A mov al, [`main'::`2'::$S1 (00427c58)]
0040113F and eax, 1
00401142 test eax, eax
00401144 jne main+4Ch (0040116c)
00401146 mov cl,byte ptr [`main'::`2'::$