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
2Max(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
2ordinary 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++语言支持,使用一定没问题 |