0040145F pop ebx
00401460 add esp,44h
00401463 cmp ebp,esp
00401465 call __chkesp (004023b0)
0040146A mov esp,ebp
0040146C pop ebp
0040146D ret
242: data() {printf("point!\n");}
00401430 push ebp
00401431 mov ebp,esp
00401433 sub esp,44h
00401436 push ebx
00401437 push esi
00401438 push edi
00401439 push ecx
0040143A lea edi,[ebp-44h]
0040143D mov ecx,11h
00401442 mov eax,0CCCCCCCCh
00401447 rep stos dword ptr [edi]
00401449 pop ecx
0040144A mov dword ptr [ebp-4],ecx
0040144D push offset string "point!\n" (00426074)
00401452 call printf (00401540)
00401457 add esp,4
0040145A mov eax,dword ptr [ebp-4]
0040145D pop edi
0040145E pop esi
0040145F pop ebx
00401460 add esp,44h
00401463 cmp ebp,esp
00401465 call __chkesp (004023b0)
0040146A mov esp,ebp
0040146C pop ebp
0040146D ret
看到上面的函数,大家应该明白了两者调用的构造函数并不一样。所以说,特化模板通常就是为了那些特殊的数据类型准备的。这样我们使用者在使用模板的时候就没有什么顾虑了,可以忽略各个数据类型处理上的差别了。当然,特化模板因为考虑了特殊模型数据,使得我们的代码更加完毕,更加健壮了,建议在设计模板的时候适当多使用。
思考题:
(1)模板类第一个type可以缺省吗?为什么会这么考虑?
(2)下面的代码在vc 6.0和vc 2005上都能编译过?为什么呢?对于我们设计代码有什么思考呢? (建议从兼容性上面考虑)
template
class data
{
public:
data() {printf("normal!\n");}
~data() {printf("~normal!\n");}
};
template
class data
{
public:
data() {printf("point!\n");}
~data() {printf("point!\n");}
};
template
class data
{
public:
data() {printf("normal!\n");}
~data() {printf("~normal!\n");}
};
template
class data
{
public:
data() {printf("point!\n");}
~data() {printf("point!\n");}
};