类模板基本语法
与函数模板基本一致
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
};
类模板与函数模板的区别
- 1.类模板没有自动类型推导
报错
正确 - 2.类模板在模板参数列表中可以有默认参数
#include<iostream>
#include<cstdarg>
using namespace std;
template<class T1=string,class T2=int>//看这里
class Person {
public:
T1 name;
T2 age;
};
int main() {
Person< > person;
person.age = 8;
person.name = "小王";
}
类模板中成员函数的创建时机
-
普通函数在实例化时创建函数
-
类模板在调用时创建函数
类模板做函数参数
请主要看下面的 test() 函数
1.传入指定类型(常用)
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
};
void test(Person<string, int > &p) {//看这里
cout << p.name << " " << p.age << endl;
}
int main() {
Person<string,int > person;
person.age = 80;
person.name = "小王";
test(person);
}
2.参数模板化
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
};
template<class T1, class T2>
void test(Person<T1, T2 > &p) {//看这里
cout << p.name << " " << p.age << endl;
}
int main() {
Person<string,int > person;
person.age = 80;
person.name = "小王";
test(person);
}
3.整个类模板化
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
};
template<class T>
void test(T &p) {//看这里
cout << p.name << " " << p.age << endl;
}
int main() {
Person<string,int > person;
person.age = 80;
person.name = "小王";
test(person);
}
类模板与继承
- 1.当子类继承父类的模板是必须要 指出父类中T的类型
重点 class man :public Person<string, int>
#include<iostream>
#include<string>
using namespace std;
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
};
class man :public Person<string, int> {
public:
void f() {
cout << "l'm a good man" << endl << "给翻译翻译" <<endl<< "我是个好男儿?" << endl << "翻译翻译"
<<endl<< "我是一个优秀的人?" << endl << "我叫你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
<< "这就对了!" << endl;
}
};
int main() {
man good;
good.f();
}
- 2.如果要灵活指出子类也可变成类模板
..
..
template<class T1, class T2>
class man :public Person<T1, T2>{
}
..
..
类模板成员函数类外实现
主要看man()函数
template<class T1,class T2>
class Person {
public:
T1 name;
T2 age;
void man();
};
template<class T1, class T2>
void Person<T1,T2>:: man (){//看这里别忘了<>
cout << "l'm a good man" << endl << "给翻译翻译" <<endl<< "我是个好男儿?" << endl << "翻译翻译"
<<endl<< "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
<< "这就对了!" << endl;
};
int main() {
Person<string,int> p;
p.man();
}
类模板分文件编写
因为类模板中成员函数的实现是在调用时,所以分文件时会导致连接不到成员函数导致出错
解决方法
将类的声明和实现同一个文件中去,并该后缀为.hpp(hpp为约定的名称)
类模板与友元
1.类内实现友元(推荐)
跟平常一样直接使用
template<class T1,class T2>
class Person {
friend void man(Person<T1, T2> p) {
cout << "我叫" << p.name << " l'm a good man" << endl << "给翻译翻译" << endl << "我是个好男儿?" << endl << "翻译翻译"
<< endl << "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
<< "这就对了!" << endl;
};
private:
T1 name;
T2 age;
public:
Person(T1 name, T2 age) {
this->name = name;
this->age = age;
}
};
2.类外实现
要声明友元的函数放在类之前, 要声明的全局函数记得要加<>
template<class T1, class T2>
class Person;
template<class T1, class T2>
void man(Person<T1, T2> p) {//要声明友元的函数放在类之前
cout << "我叫" << p.name << " l'm a good man" << endl << "给翻译翻译" << endl << "我是个好男儿?" << endl << "翻译翻译"
<< endl << "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
<< "这就对了!" << endl;
};
template<class T1,class T2>
class Person {
friend void man<>(Person<T1, T2> p);//要声明的全局函数记得要加<>
private:
T1 name;
T2 age;
public:
Person(T1 name, T2 age) {
this->name = name;
this->age = age;
}
};
int main() {
Person<string, int> p("王铁柱",28);
man(p);
}