cp是中模板编程是泛型技术实现的基础,包含函数模板和类模板。
函数模板
- 使用template - 或者template - 进行类型声明。 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 using namespace std;
 template <typename T>
 const T& Max(const T& a, const T& b)
 {
 return a>b?a:b;
 }
 int main()
 {
 cout<<Max(1,2)<<endl;
 cout<<Max(1.0,2.0)<<endl;
 return 0;
 }
- 函数模板使用时可以不指定类型,由编译器自动推导,也可以显示指定。 - 1 
 2
 3- // 一下两种写法均可 
 Max<double>(1.0,2.0);
 Max(1.0,2.0);
- 函数模板如果让编译器自动推断类型,必须进行严格类型匹配,不能像普通函数一样进行自动类型转换。如果想要进行自动类型转换,需要显示指定类型。 - 1 
 2- Max(1.0, 2); // 错误,不能自动把2转换成double或者float 
 Max<double>(1.0, 2); // 正确
- 在函数模板和普通函数都能匹配时,优选选择普通函数。 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 using namespace std;
 template <typename T>
 const T& Max(const T& a, const T& b)
 {
 cout<<"template function!"<<endl;
 return a>b?a:b;
 }
 const int& Max(const int& a, const int&b)
 {
 cout<<"ordinary function!"<<endl;
 return a>b?a:b;
 }
 int main()
 {
 cout<<Max(1,2)<<endl;
 return 0;
 }- 输出 - 1 
 2- ordinary function! 
 2- 类模板
| 1 | 
 | 
类模板派生
- 类模板派生普通类,需要指定具体泛型类别;
- 类模板派生模板类,继续使用template。
类模板与函数模板区别
- 类模板不存在自动推导,必须要显示指定类型,因为编译器需要知道占据内存大小;
- 类模板可以使用默认参数; 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18// 这里的AgeType默认类型为int 
 template <typename NameType, typename AgeType=int>
 class Person
 {
 public:
 Person(NameType name, AgeType age)
 {
 mName = name;
 mAge = age;
 }
 void showPerson()
 {
 cout << "name: " << mName << " age: " << mAge << endl;
 }
 private:
 NameType mName;
 AgeType mAge;
 };模板存在两次编译过程,第二次是直接编译模板本身,第二次是根据调用情况将模板翻译成具体数据类型的函数。由于模板需要两次编译和C++的分离式编译特点,模板类的声明和实现需要写在一个文件中,否则会出现链接错误,这样的文件后缀为hcpp。
补充
为了防止头文件重复包含,C/C++中使用两种方式
| 1 | // C/C++语言支持,使用一定没问题 | 
 
		 
                      