前言一、函数模板
1.函数模板基本语法2.函数模板注意事项3.普通函数与函数模板4.模板局限性 二、类模板
1.类模板语法2.类模板和函数模板区别3.类模板成员函数创建时机4.类模板对象做函数参数5.类模板与继承6.类模板成员函数类外实现
前言
概念:建立通用的模板,提高复用性。在生活中有很多这样的模板,比如ppt模板,简历模板。c++除了面向对象之外还有一种编程思想叫泛型编程,主要用到模板。c++提供的两种模板机制分别为函数模板和类模板
一、函数模板 1.函数模板基本语法//template----声明模板 //typename ---- 表明其后符号是一个数据类型,可用class替换 //T ---- 通用数据类型 templatevoid mySwap(T &a,T &b) { T temp = a; a = b; b =temp; } void test() { float a = 10.0; float b = 11.0; mySwap(a,b); //使用方式1.自动类型推导 mySwap (a,b); //2.显式指定类型 }
实质:类型参数化
2.函数模板注意事项1.需要推出一致的数据类型。
2.模板必须要确定T的数据类型才可以使用(当无参时,需要这样做func<数据类型>())。
1.区别
普通函数传参发生隐式类型转换
函数模板调用时如果是自动推导不会发生类型转换,若显式指定则会发生。
2.调用规则
①如果函数模板和普通函数都可以调用,优先调用普通函数
②通过空模板参数类型(<>)可强制调用函数模板
③函数模板可重载
④如果函数模板可以产生更好匹配,优先调用函数模板
templatevoid test(T a, T b) { a = b; } //若a和b是数组,赋值 *** 作无法实现 template bool test2(T a,T b) { if(a>b) } //若T是一个Person类,且该class内无关系运算符重载,也无法正确运行
解决办法
//重载一个,此时传Person参数时会匹配这个函数 template<> bool test2(Person &a,Person &b) { }二、类模板 1.类模板语法
作用:建立一个通用类,类中成员数据类型可不具体指定,用一个虚拟的类型代表。
语法:
templateclass ...
例子
template2.类模板和函数模板区别class Person { public: Person(NameType name,AgeType age) { this->name = name; this->age = age; } NameType name; AgeType age; }; void test() { Person p1("Tom",10); }
1.类模板没有自动类型推导
2.类模板在模板参数列表中可以有默认参数
template3.类模板成员函数创建时机class Person { public: Person(NameType name,AgeType age) { this->name = name; this->age = age; } NameType name; AgeType age; }; //1.类模板没有自动类型推导 void test1() { Person p("Tom",100); //报错 } //2.类模板在模板参数列表中可以有默认参数 //template //这时实例化时可以不指定int
普通类成员函数一开始就创建
类模板成员函数调用时创建
原因是编译时不知道具体的数据类型是什么,只有在动态运行时才能知道
template5.类模板与继承class Person { public: Person(NameType name,AgeType age) { this->name = name; this->age = age; } NameType name; AgeType age; }; //1.指定传入类型(最常用) void print(Person &p) //2.参数模板化 template void print2(Person &p) //3.整个类模板化 template void print2(T &p)
当子类继承的父类是一个类模板时,必须指定父类中T的数据类型,否则编译器无法给子类分配内存。
如果想灵活指定父类T,子类也必须成为类模板
template6.类模板成员函数类外实现class base { public: T m; }; // class Son :public base 此时错误 { }; class Son :public base //正确,但此时只能是int { } //如果想灵活指定父类T,子类也必须成为类模板 template class Son2: public base //T2关联父类的数据类型 { public: T1 obj; }
templateclass Person { public: Person(NameType name,AgeType age); NameType name; AgeType age; }; template Person ::Person(NameType name,AgeType age) { this->name = name; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)