函数模板的基础语法
为了简化函数的书写,可以选择将类型参数化,编写的代码便可以忽略类型。编译器根据传的值,对类型进行自动推导。
template<class T>
void mySwap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
函数模板与普通函数的区别
- 函数模板不允许自动类型转换
- 普通函数能够进行自动类型的转换
C++编译器模板机制剖析
cpp--预编译器(将include的文件进行整合)>>.i--编译器>>.s(汇编文件)--汇编器>>.obj(目标文件、二进制文件)--连接器>>.exe
函数模板通过具体类型产生不同的函数。编译器会对函数模板进行两次编译,在声明的时候对模板代码本身进行编译,在调用的时候对参数替换后的代码进行编译
类模板
利用类模板来生成派生类的时候,需要明确类型,利用类模板来生成派生类模板的时候就可以不用明确
标准的.h+.cpp的写法中,.h会加上#pragma once以防止头文件重复包含
template<class T>
class Person
{
public:
Person(T id, T age) {
this->id = id;
this->age = age;
}
~Person();
void Show() {
cout << this->id << this->age << endl;
}
private:
T id;
T age;
};
void main() {
Person<int> person(10, 20);
}
头文件和cpp文件分离的写法
//Animal.h
#pragma once
#include <iostream>
#include<stdio.h>
using namespace std;
template<class T1,class T2>
class Animal {
public:
Animal(T1 name, T2 age);
void Print();
public:
T1 mName;
T2 mAge;
};
//Animal.cpp
#include"Animal.h"
template<class T1,class T2>
Animal<T1, T2>::Animal(T1 name, T2 age) {
this->mName = name;
this->mAge = age;
}
template<class T1,class T2>
void Animal<T1, T2>::Print() {
cout << this->mName << this->mAge << endl;
}
- 注意
当头文件和cpp文件分离的时候,如果主文件仅仅include头文件,那么他在编译的时候仅仅进行第一次编译,即不会产生实际的运行函数,而只有模板函数,所以为了正确调用,在主文件中需要includecpp文件来保证程序的运行
当然,也可以将类模板分离写法中的cpp文件改名为hpp
类模板遇到static
类模板中的静态变量只适用于各自的模板,即第二次编译的结果
template<class T>
class Person {
public:
static int a;
};
template<class T>int Person<T>::a = 0;
void main() {
Person<int> p1, p2, p3;
Person<double> pp1,pp2, pp3;
p1.a = 10;
pp1.a = 100;
cout << p2.a << endl;//10
cout << pp2.a << endl;//100
getchar();
}