background image

    可以看到,我们在第二个参数使用了缺省类型 int,那么怎么证明缺省类型可以使用呢?我们设计了下面一

 

个测试用例:

[cpp] 

view plaincopyprint?

1.

239:      data<

int

int

> m(2);  

2.

004013BD   push        2  

3.

004013BF   lea         ecx,[ebp-10h]  

4.

004013C2   call        @ILT+5(data<

int

,

int

>::data<

int

,

int

>) (0040100a)  

5.

004013C7   mov         dword ptr [ebp-4],0  

6.

240:      data<

int

> n(3);  

7.

004013CE   push        3  

8.

004013D0   lea         ecx,[ebp-14h]  

9.

004013D3   call        @ILT+5(data<

int

,

int

>::data<

int

,

int

>) (0040100a)  

    上面的代码定义了两个临时变量,其中第一个是 m,输入类型是 int;第二个临时变量是 n,输入类型是 int

和 int。前面我们说过缺省类型是 int,那么第一个临时变量 m 和第二个临时变量 n 的构造函数地址应该是一样

的。那么事实上两者的构造函数是不是一样的呢?我们可以查看两者的函数地址,发现一个是 0x0040100a,

另外一个也是 0x0040100a

 

。范例证明我们的判断是正确的。

    明白了上面的缺省模板构造,下面我们谈一下特化模板。特化模板是什么意思呢?其实并不复杂。因为模板

类既然是通用模板,那么其中的数据类型可以是任意数据类型,但是难免有一些数据类型(比如说指针),

我们需要对其中的一些操作做一些细微的修改,但是这些小的修改在原来的模板定义上是无法做的。那么怎么

办?我们只好重新定义一种形式,它和模板类定义的名称一致,但是形式稍有差别。我们可以编写一个测试看

看:

[cpp] 

view plaincopyprint?

1.

template <typename type>  

2.

class data  

3.

{  

4.

public:  

5.

    data() {printf("normal!\n");}  

6.

    ~data() {printf("~normal!\n");}  

7.

};  

8.

  

9.

template <>  

10.

class data<

int

*>  

11.

{  

12.

public:  

13.

    data() {printf("point!\n");}  

14.

    ~data() {printf("point!\n");}  

15.

};  

    上面的代码定义了两个类模板。但是两者的名称是一样的,说明这两个类定义的内容其实具有很大的相似性。

第一种定义就是标准模板类的定义,第二中稍微复杂一点,使用缺省的 int*,因为没有使用到特定的 type 类