携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
6. 整个类模板化
#include <fstream>
#include <string>
using namespace std;
//类模板
template<class N , class A >
class H
{
public:
H(N name, A age)
{
this->Name = name;
this->Age = age;
}
void h_idol()
{
cout << "name: " << this->Name << " age: " << this->Age << endl;
}
public:
N Name;
A Age;
};
template<class H1>
void spr(H1 &h01) {
h01.h_idol();
cout << "H1的类型为: " << typeid(H1).name() << endl;
}
void test()
{
// 指定NameType 为string类型,AgeType 为 int类型
H<string,int> h01("白敬亭",28);
spr(h01);
}
int main() {
test();
system("pause");
return 0;
}
输出:
name: 白敬亭 age: 28
H1的类型为: class H<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>
请按任意键继续. . .
结论:
- 通过类模板创建的对象,可以有三种方式向函数中进行传参
- 使用比较广泛是第一种:指定传入的类型
7.类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的max函数,这个函数就只能实现int 型,对数组等字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个max函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个smax模板函数,即可以实现int 型,又可以实现浮点型的交换。模板可以应用于函数和类。
注意: 模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围函数内进行,比如不能在main函数中声明或定义一个模板。
类模板与函数模板:
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。