导航
1.类模块的基本形式
2.类模块与函数模板的区别
3.类模板中成员函数的调用时机
4.类模板对象作函数参数
5.类模板与继承
6.类模板中构造函数及成员函数类外实现
———————————————————————————————————
1.类模块的基本语法
语法:template< class T>
类
看例子:
#include <iostream> using namespace std; #include <string> template<class TypeName,class TypeAge> //这里定义未定类型名 class Person { public: Person(TypeName name,TypeAge age) //构造函数赋值 { this->name = name; this->age = age; } void show() //进行打印输出 { cout<<"姓名:"<<this->name<<endl; cout<<"年龄:"<<this->age<<endl; } TypeName name; TypeAge age; }; void test() { //string型及整型 Person <string,int>p1("小明",15); //这里注意<>中要输入你想要传入的类型,后面再传入参数 p1.show(); //int 及 int型 Person <int,int>p2(14,12); p2.show(); } int main() { test(); system("pause"); return 0; }
注意点:Person <int,int>p2(14,12); 这里<>与后面()传的类型要一致
可以传自己想传入的类型
———————————————————————————————————
2.类模板与函数模板区别
1.类模板使用只能用显示指定类型方式
2.类模板的模板参数可以有默认参数
例:
声明
template<class TypeName,class TypeAge = int> //这里可以用默认类型参数 class Person { public: Person(TypeName name,TypeAge age) //构造函数赋值 { this->name = name; this->age = age; } void show() //进行打印输出 { cout<<"姓名:"<<this->name<<endl; cout<<"年龄:"<<this->age<<endl; } TypeName name; TypeAge age; };
调用
Person <string,int>p1("小明",15); //这里注意<>中int可加可不加
——————————————————————————————————
3.类模板中成员函数的调用时机
类模板中的成员函数并不是一开始就创建的,只有在调用时才创建
例:
#include <iostream> using namespace std; #include <string> class Person1 { public: void show() { cout<<"person1调用"<<endl; } }; class Person2 { public: void show1() { cout<<"person1调用"<<endl; } }; template<class T> //这里定义未定类型名 class Person { public: T obj; void print() //在不确定类型前不创建,调用时才创建 { obj.show(); } void print1() { obj.show1(); } }; void test() { Person<Person1>p; p.print(); //p.print1(); } int main() { test(); system("pause"); return 0; }
———————————————————————————————————
4.类模板对象作函数参数
1.指定传入类型(最常用)
#include <iostream> using namespace std; #include <string> template<class T1,class T2> class Person { public: Person(T1 name,T2 age) { this->name = name; this->age = age; } void show() { cout<<"名字:"<<name<<" "<<"年龄:"<<age<<endl; } T1 name; T2 age; }; void getInfo(Person <string,int>&p) //指定传入类型 { p.show(); } void test() { Person <string,int>p("小明",12); getInfo(p); } int main() { test(); system("pause"); return 0; }
注意:void getInfo(Person <string,int>&p) //指定传入类型
2.参数模板化
template<class T1,class T2> void getInfo2(Person <T1,T2>&p) //参数模板化 { p.show(); }
3.整个类模板化
//3.整个类模板化 template<class T1> void getInfo3(T1 &p) { p.show(); }
———————————————————————————————————
5.类模板与继承
注意:父类是类模板,子类需要指定出父类中T的数据类型
例:
#include <iostream> using namespace std; #include <string> //父模板 template<class T> class Person { public: T name; }; //继承父模板的子模板 template<class T,class T1> class son:public Person<T> //继承父模板子类也应该为子模板 { public: son() { cout<<"T1的类型:"<<typeid(T).name()<<endl; //从父模板继承过来为int cout<<"T2的类型:"<<typeid(T1).name()<<endl; //此时obj为char型 } T1 obj; }; void test() { son<int,char>s; //显示指定类型参数 } int main() { test(); system("pause"); return 0; }
———————————————————————————————————
6.类模板中构造函数及成员函数类外实现
例:
#include <iostream> using namespace std; #include <string> //类模板 template<class T1,class T2> class Person { public: //构造函数 Person(T1 name,T2 age); //成员函数 void showPerson(); T1 name; T2 age; }; //构造函数类外声———————————————————————————————————————————————————————————— template<class T1,class T2> Person<T1,T2>::Person(T1 name,T2 age) { this->name = name; this->age = age; } //成员函数类外声 template<class T1,class T2> void Person<T1,T2>::showPerson() { cout<<"姓名:"<<this->name<<" "<<"年龄:"<<this->age<<endl; } //———————————————————————————————————————————————————————————————————————————— void test() { Person <string,int>p("小王",15); p.showPerson(); } int main() { test(); system("pause"); return 0; }
注意:类模板成员函数类外实现,需要加上模板参数列表