类模板

来源:互联网 发布:知乎投资理财 编辑:程序博客网 时间:2024/06/05 18:13


1.类模板是函数模板的升级:

a.c++中可以将模板的思想应用于类,使得类可以不关注具体所操作的数据类型,而只关注类所需要实现的功能。 b.函数模板是使一个函数体适合各种类型的数据,类模板是使一个类适合各种类型的数据(包括成员函数和成员变量,当使得成员函数满足各种类型的数据的时候,其实就是在使用函数模板,所以说类模板是函数模板的升级) ,函数模板是类模板中的一部分。 c.类模板常用于一些存储和组织数据元素的类中,如:数组类、链表类、stack类、queue类等

2.类模板的语法规则:

a.类模板的作用就是提供一种特殊的类以相同的行为处理不同的类型 b.类模板的使用跟函数模板的使用一样,在定义类的前面声明template ,说明类中使用泛指类型T c.类模板的应用,当使用类模板定义对象时,要指明具体类型,如:test t1 即t1就是满足int类型的对象 示例代码,如下:

#include <iostream> using namespace std; template <typename t="">class test{public:    int a;    T a1;    T add(T b, T c)    {        return b + c;    }    T min(T b, T c);}; template <typename t="">T test<t>::min(T b, T c){    return b - c;} int main(){    test<int> t1;    cout << t1.add(4, 6) << endl;     cout << t1.min(6, 4) << endl;    return 0;} </int></t></typename></typename></iostream>



注意:声明的泛指类型T可用于声明成员变量和成员函数

3.类模板的深入理解:

a.对于函数模板,编译器进行了两次编译,第一次是直接对函数模板进行编译,看函数模板是否存在语法错误。第二次是在指明类型,让函数模板创建出具体类型的函数,调用具体类型的函数的时候,对具体函数进行编译。最终程序中只存在具体类型的函数,不存在函数模板。 b.类模板跟函数模板的处理方式是一样的,也是进行两次编译,第一次是对类模板进行编译,判断类模板是否存在语法错误。第二次是在类模板创建出具体类型的对象之后 test t1 ,当t1对象调用类模板中的成员函数的时候,调用那个成员函数就会产生那个类模板成员函数的具体类型的函数(这里是int类型的函数),没调用的类模板成员函数则不会产生可执行代码,调用的类模板成员函数才会产生具体类型的函数(具体类型是根据调用者的对象决定的),才会产生可执行代码。

4.函数模板与类模板的工程应用:

a.一般在工程中,函数的实现和函数的调用是在不同的文件中的,类的实现和类的使用也是在不同的文件中的。但是对于函数模板和类模板,模板的实现和使用必须在同一个文件中。因为模板是要在使用的时候,进行二次编译的,如果不在同一个文件中,当使用模板的时候编译器进行二次编译就找不到模板了。会产生链接错误!所以函数模板和类模板不能像普通函数和普通类一样分开实现后,在使用时只包括头文件!必须要把使用和实现放在一起。在工程实践中,一般会把类模板的定义直接放在头文件中,此时使用的头文件不再是 .h文件了,是 .hpp文件。hpp文件,就是告诉程序员,其中存放的是模板的实现,其实在编译的时候,hpp文件中的内容会被包含到#include "test.hpp"指定的cpp文件中去,这里面之所以表面上分开存放在hpp文件和cpp文件中,是为了开发的时候,使得代码工程清晰明了,有层次感!
0 0
原创粉丝点击