目录
语法:
template<typename T>
类
类模板和函数模板的区别:
1.类模板没有自动类型推导的使用方式
2.类模板在模板参数列表中可以有默认参数(在c++11之后函数模块也可以有默认参数了)
#include <iostream>
#include <string>
using namespace std;
//类模板
template<typename nameType,typename ageType>
class Person{
public:
Person(nameType name,ageType age=int) //age默认参数类型为int
{
this->m_name=name;
this->m_age=age;
}
void showPerson()
{
cout<<"name:"<<this->m_name<<" age:"<<this->m_age<<endl;
}
nameType m_name;
ageType m_age;
};
int main()
{
//Person p1("张三",25);错误,无法自动类型推导
Person<string,int> p1("张三",25);
p1.showPerson();
Person<string> p1("李四",26);
p1.showPerson();
return 0;
}
普通类和类模板的成员函数创建时机:
1.普通类中的成员一开始就被创建
2.类模板中的成员函数在调用时才被创建
类模板与继承:
示例(非完整):
#include <iostream>
using namespace std;
template<typename T>
class Father{
public:
T m;
};
//必须要指定父类中的T类型,才可以继承
class Son1:public Father<int>{
};
//或者灵活指定父类中的T类型
template<typename T1,typename T2>
class Son2:public Father<T2>{
public:
T1 obj;
};
类模板成员函数类外实现:
示例(非完整):
#include <iostream>
#include <string>
using namespace std;
template<typename T1,typename T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson()
{
cout<<"姓名:"<<this->m_Name<<" 年龄:"<<this->m_Age<<endl;
}
T1 m_Name;
T2 m_Age;
};
//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name=name;
this->m_Age=age;
}
类模板的分文件实现:
person.h文件
#pragam once
#include <iostream>
#include <string>
using namespace std;
template<typename T1,typename T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
person.cpp文件
#include "person.h"
//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name=name;
this->m_Age=age;
}
template<typename T1,typename T2>
void Person<T1,T2>::showPerson()
{
cout<<"姓名:"<<this->m_Name<<" 年龄:"<< this->m_Age<<endl;
}
1.main中调用的时候,直接包含源文件,即在main.cpp中 #include "person.cpp"(不推荐这个方法)
2.将.h和.cpp的内容写在一起,将后缀改为.hpp文件,在main.cpp文件中引入#include "person.hpp"
person.h --> person.hpp
#pragam once
#include <iostream>
#include <string>
using namespace std;
template<typename T1,typename T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name=name;
this->m_Age=age;
}
template<typename T1,typename T2>
void Person<T1,T2>::showPerson()
{
cout<<"姓名:"<<this->m_Name<<" 年龄:"<< this->m_Age<<endl;
}
类模板的友元实现:
1.全局函数类内实现,直接在类内声明友元
2.全局函数类外实现,要提前让编译器知道该函数的存在
#include <iostream>
#include <string>
using namespace std;
//------全局函数类外实现需要------
template<typename T1,typename T2>
class Person;
template<typename T1,typename T2>
void showPerson2(Person<T1,T2> P);
{
cout<<"姓名:"<<P.m_Name<<" 年龄:"<< P.m_Age<<endl;
}
//------全局函数类外实现需要------
template<typename T1,typename T2>
class Person{
//全局函数类内实现
friend void showPerson(Person<T1,T2> P)
{
cout<<"姓名:"<<P.m_Name<<" 年龄:"<< P.m_Age<<endl;
}
//全局函数类外实现
//加空模板参数列表,且要让编译器提前知道有这个函数的存在
friend void showPerson2<>(Person<T1,T2> P);
public:
Person(T1 name,T2 age)
{
this->m_Name=name;
this->m_Age=age;
}
private:
T1 m_Name;
T2 m_Age;
};
int main(){
Person<string,int> p("jane",25);
showPerson(p);
Person<string,int> p2("TOM",25);
showPerson2(p2);
return 0;
}